自定义字体在 IB 中显示,但在模拟器中不显示

Custom font displays in IB but not in simulator

我已经设置了 UITextViewUILabel 来使用自定义字体。 (这是一个垂直镜像的蒙古字体,但我也包含了英文文本,以便您可以看到效果。)在Interface Builder中显示的文字,但在模拟器中 UITextView 中的大多数字符只是空的盒子。奇怪的是,在UILabel中的字符在模拟器中确实显示正确。

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

备注:

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

更新

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

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

  1. 开始一个新的单视图项目。
  2. 将字体添加到项目中(可以从相关 github 项目中下载 here
  3. 在 Info.plist 文件中添加 "Fonts provided by application" 字体名称 "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)!)
    }
}

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

创建 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 文件的名称添加到属性中的标签。

Common Mistakes With Adding Custom Fonts to Your iOS App 是使自定义字体正确显示的有用清单。但是,none 这些东西在这种特殊情况下有效。

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

选项 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 中进行更改并立即查看更改。

看来,当我第一次将字体导入我的项目时我选择了 "Add to target membership",在检查字体后,没有 添加到目标!它在 Interface Builder 中工作得很好,但在 sim 或编译时不起作用。

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

如果您使用的是 webfont,则 download.ttf 文件并将其放入您的项目中。不要忘记在 xcode

上勾选 copy items if needed

接下来将其添加到信息 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];