【问题标题】:Custom font displays in IB but not in simulator自定义字体在 IB 中显示,但在模拟器中不显示
【发布时间】:2015-09-10 04:49:39
【问题描述】:

我设置了UITextViewUILabel 来使用自定义字体。 (它是一种垂直镜像的蒙古字体,但我还包括了英文文本,以便您看到效果。)在Interface Builder中显示文字,但在模拟器中UITextView中的大部分字符只是空框。奇怪的是,UILabel 中的字符确实在模拟器中正确显示。

如何让它们也显示在UITextView 中?

注意事项:

  • 我使用的是 Xcode 版本 6.3.2。从this SO Q&A 我知道自定义字体应该在 IB 中与 Xcode 6 一起使用。
  • 我已将我的字体文件添加到项目中,并从 UITextViewUILabel 的自定义字体列表中选择它。
  • 我在项目的Info.plist 中添加了“应用程序提供的字体”键,并向其中添加了我的自定义字体。
  • This question 是一个非常相似的(但不同,因为它没有提到UITextViewUILabel 问题)。在撰写本文时,该问题的 OP 尚未表明投票最多的答案是否有帮助。我在that answer 中运行代码以确认我的字体确实在捆绑包中。我得到了以下结果,它确认它在捆绑包中,所以仍然不能解决我的问题。

    Family : ChimeeWhiteMirrored
        Font : ChimeeWhiteMirrored
    

有没有人看到我的错误或有其他想法?

更新

在收到@darkheartfelt 的反对票和comment 对我下面的回答后,我重新创建了我原来的问题,以为我可能错过了一些东西。尽管在 iOS 9 中字体在模拟器中的显示有所不同,但基本问题仍然存在:在 IB 中看起来还可以,但在模拟器中却不行。

问题可以重现如下(使用Xcode 7.1.1):

  1. 开始一个新的单视图项目。
  2. 将字体添加到项目中(可以从相关的github项目中下载here
  3. 在 Info.plist 文件中添加“应用程序提供的字体”,字体名称为“ChimeeWhiteMirrored.ttf”。
  4. 确认目标的“Copy Bundle Resources”包含 ChimeeWhiteMirrored.ttf。
  5. UITextView 添加到情节提要。
  6. 在 IB 属性检查器中粘贴以下文本:1-10:           one two three four five six seven eight nine ten
  7. 在 IB 属性检查器中,将字体设置为自定义,将系列设置为 ChimeeWhiteMirrored。

这重现了特殊字符的问题,正如我在下面的回答中所描述的,我发现解决此问题的唯一方法是在代码中设置字体。

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        // set custom font
        textView.font = UIFont(name: "ChimeeWhiteMirrored", size: (textView.font?.pointSize)!)
    }
}

如果我错了或遗漏了什么,请告诉我。在此之前,我将不得不继续使用下面我接受的答案。

【问题讨论】:

  • 这是解决这个问题的完美的遍历codewithchris.com/…
  • 毫无疑问,当前的 iOS/Xcode (2017) 存在缺陷。 有时您必须在 plist 中包含字体文件名,有时您不必这样做。这是一个错误。
  • @Fattie,感谢您的链接。将来我将在我想要制作的框架中再次重新审视这一点,这将是一个有用的参考。

标签: ios xcode fonts interface-builder mongolian-vertical-script


【解决方案1】:

看来,当我第一次将字体导入我的项目时,我选择了“添加到目标成员资格”,但在检查字体后,它没有添加到目标!它在 Interface Builder 中运行良好,但在 sim 中或编译时无法运行。

在项目文件夹视图中选择字体文件并选中目标成员框修复它:

【讨论】:

    【解决方案2】:

    创建 2 个类别类

    -------UILabel+ChimeeWhiteMirrored.h--------------
    
    #import <UIKit/UIKit.h>
    
    @interface UILabel (ChimeeWhiteMirrored)
    @property (nonatomic, copy) NSString* fontNamelight;
    @property (nonatomic, copy) NSString* fontNamebold;
    @property (nonatomic, copy) NSString* fontNameboldIltalic;
    @property (nonatomic, copy) NSString* fontNameRegular;
    @end
    
    --------------------------------------------
    -------UILabel+ChimeeWhiteMirrored.m--------------
    
     #import "UILabel+ChimeeWhiteMirrored.h"
    
     @implementation UILabel (ChimeeWhiteMirrored)
    
    
     - (NSString *)fontNamelight {
         return self.font.fontName;
     }
     - (NSString *)fontNamebold {
         return self.font.fontName;
     }
     - (NSString *)fontNameRegular {
         return self.font.fontName;
     }
    
     - (NSString *)fontNameboldIltalic {
         return self.font.fontName;
     }
    
    
    
     - (void)setFontNameRegular:(NSString *)fontName {
         self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
     }
    
     - (void)setFontNamelight:(NSString *)fontName {
         self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
     }
    
     - (void)setFontNamebold:(NSString *)fontName {
         self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
     }
    
     - (void)setFontNameboldIltalic:(NSString *)fontName {
         self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
     }
    
    
    
    
     @end
    
    --------------------------------------------
    

    并在项目代码文件夹中添加ttf文件而不是直接将ttf文件的名称添加到属性中的标签。

    【讨论】:

    • 你碰巧知道 Swift 版本吗?如果没有,没问题,但是我对 Objective C 不是很熟悉,所以我可能需要一段时间才能弄清楚如何在 Swift 中执行此操作并让您知道它是否解决了问题。
    • 感谢您的回答。 I learned a lot 通过研究它,虽然我最终没有完全使用它,但它是找到答案的关键。 +1
    • 抱歉,这些字符没有出现在stackoverflow中:“          " 它们只是显示为正方形。我是否正确假设您现在唯一的问题是您的某些角色被表情符号覆盖?
    【解决方案3】:

    Common Mistakes With Adding Custom Fonts to Your iOS App 是一个帮助自定义字体正确显示的清单。然而,这些东西在这种特殊情况下都不起作用。

    除了你在笔记中做的事情,你还需要在代码中设置字体。有几种方法可以做到这一点。

    选项 1:直接硬编码

    这就像执行以下操作一样简单:

    myUITextView.font = UIFont(name: "ChimeeWhiteMirrored", size: myUITextView.font.pointSize)
    

    注意名称是字体名称,而不是字体文件名(ChimeeWhiteMirrored.ttf)。

    选项 2:用户定义的运行时属性

    如果您想避免在代码中执行此操作,可以使用 User Defined Runtime Attributes 执行此操作。感谢@SandeepAgrawal 提出这个想法。请点赞他的回答。对我有用的 Swift 版本是

    import UIKit
    
    extension UITextView {
        
        public var myFontName: String {
            get {
                return self.font.fontName
            }
            set {
                self.font = UIFont(name: newValue, size: self.font.pointSize)
            }
        }
    }
    

    然后在视图的身份检查器中添加键路径、类型和值,如下图所示。

    选项 3:IBInspectable

    From what I have read,使用用户定义的运行时属性是老式的做法。使用 IBInspectable(和 IBDesignable)允许您在 Interface Builder 中进行更改并立即查看更改。

    【讨论】:

    • "你还需要在代码中设置字体。"
    • @darkheartfelt,我已经完成了所有这些事情。我能够让自定义字体出现在 IB 和情节提要中,但不在应用程序中。我再次重做整个示例只是为了测试这一点。您可以在上面的原始问题中看到我对您的评论的更新和回复。
    • “复制捆绑资源”是关键
    • @darkheartfelt(只是从我的生活中滑下来写这个:)),你知道,即使在几年后的今天,它也是 iOS 中的一个众所周知的错误。有时您确实需要在代码中设置它。有时您确实需要在 plist 中设置它,而有时在 plist 中设置它会使其失败。只是苹果的另一个(幸运的是相当罕见)“彻底搞砸”!
    • 我不得不将旧的“自定义字体项目”迁移到我的新用户帐户。克里斯教程是一个很好的清单,但遗憾的是我有一个不同的问题。我想给你一个关于使用自定义字体和项目迁移的故事板的额外提示: 1. 验证你的系统之前安装了选择的字体 2. 打开 Xcode 项目然后编译并运行(然后一切都应该没问题)否则故事板将使用系统默认字体清除所有自定义字体设置!
    【解决方案4】:

    如果您使用的是 webfont,请下载.ttf 文件并将其放入您的项目中。不要忘记在 xcode 上勾选 copy items if needed

    接下来在 info plist 上添加这个

    <key>UIAppFonts</key>
        <array>
            <string>Your fontname.ttf</string>
            <string>Bakersfield Bold.ttf</string>
       </array>
    

    现在看看字体系列名称。您还可以在字体文件中找到它。从你下载的地方你也可以到达那里。就像我添加的字体,ttf 文件名是:Bakersfield Bold.ttf 这个字体名是:Bakersfield-Bold 就是这样。喜欢

    UIFont *helvFont = [UIFont fontWithName:@"Bakersfield-Bold" size:14.0];
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2013-03-26
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2014-11-21
      • 1970-01-01
      相关资源
      最近更新 更多