在 Xcode 3 的时代,如果要使用自定义字体,只要把字体安装到系统中,就能够在 Interface Builder 中字体列表中选择到,当然需要把字体文件加到项目中,并且在 Xxx-Info.plist 文件中列举出来。
而到了 Xcode 4 后,要用个自定义的字体反而更难了,字体安装到了系统中,它也不会出现在 Interface Builder 中的字体列表,必须用 setFont 为需要的控件应用自定义字体,这是一个浩大的工程,要么遍历控件,要么就得为控件与 IBOutletCollection 关联起来。
难道是 Apple 不希望看到应用中各色字体令人眼花缭乱的景象,所以制造点障碍。也不知道新的 Interface Builder 中的字体列表由哪得来的,是否能把自己的字体出现在该列表中呢?这个嘛,有点难。
既然不想使用 setFont 方法对 Xib 中的众多的控件一一设置字体,那就得另寻 Hack 方法了,幸好有了 FontReplacer 的方法。FontReplacer 是为 UIFont 做的一个 Category,它的实现原理是利用 method_exchangeImplementations 机制把 UIFont 的 fontWithName:size: 和 fontWithName:size:traits: 换成自定义的方法,然后在自定义的方法中按照预设置的字体映射,当遇到某个系统字体 A 时,换成自定义的字体 Custom-A。
而你所要做的就是在 Interface Builder 中寻找字体,自己记住当选用了 系统字体 A,运行时会是 Custom-A 字体,系统字体 B 运行时会是 Custom-B,根据需要自己映射就行。一般方便起见,我们会选择一种字体(Family),然后用它的 Style 来与我们的自定义字体对应。这样只需要 Interface Builder 里像往常一样设置字体就行了,从而达到一劳永逸。
下面介绍它的应用方法:
首先,与以往一样,需要把字体文件加入到项目中来,并在 Xxx-Info.plist 中,在 Fonts provided by application 数组中一一列出来。
这里的 FontReplacer 还需要你在 Xxx-Info.plist 文件中建立一个 ReplacementFonts 键值,类型为 Dictionary,如下图:
我找到了 Helvetica 正好有几种 Style 能与我的自定义字体进行一一映射,依据上面的 ReplacementFonts 配置,当你设置的字体是 Helvetica-Light 就会应用 Unmi-Light 字体,Helvetica-LightOblique 会变成 Unmi-LightItalic,等等.....
上图是在 Interface Builder 中为需要用自定义字体的控件设置待替换的字体,比如这里设置的 Helvetica Light 运行时会被替换成 Unmi-Light,字号不会变的。
上图选择的字体名依次是:
Helvetica-Bold
Helvetica-BoldOblique
Helvetica-Light
Helvetica-LightOblique
Helvetica-Oblique
Helvetica
然后你需要把 FontReplacer 中的 UIFont+Replacement.h 和 UIFont+Replacement.m 文件加到项目中来,它们从 https://github.com/0xced/FontReplacer/tree/master/UIFont%2BReplacement 下载。注意它们距离现在是一光年,还不是 ARC 的,如果你的项目是 ARC 的,需要把 UIFont+Replacement.m 中的:
1 2 |
[replacementDictionary release]; replacementDictionary = [aReplacementDictionary retain]; |
ARC 化为
1 |
replacementDictionary = aReplacementDictionary; |
现在跑一下你的应用,看看字体是不是达到你的预期了。你可以在 Controller 的 viewDidLoad 中用:
1 |
NSLog(@"font: %@", self.label.font.fontName); |
输出 label 当前的字体,成功的话就会变成自定义的字体,而非 Interface Builder 中设置的字体。
如果你还想更懒的话,甚至有时候都不想去 Interface Builder 为某个控件选择一个特别的字体,那你可以用 System, System Bold 和 System Italic 字体,如下图:
默认情况下,System 采用了 Helvetica 字体,但我觉得这不太可靠的,说不定哪里 Apple 把 隶书 作为系统字体呢,这当然不可能,就是要让你别太放心用 System 字体。System 的三种字形的字体名依次对应如下:
Helvetica
Helvetica-Bold
Helvetica-Oblique
所以你可以对以上三种字体建立到自定义字体的映射,比如让 Helvetica 映射到 Unmi-Light 字体,那么通常情况下,你在 Interface Builder 里字型选择上可以无所作为,字号选择恐怕经常是免不了的。
除了可在 Xxx-Info.plist 文件中用 ReplacementFonts 建立映射关系,也可编程方式在程序运行早期调用 UIFont(Replacement) 的 setReplacementDictionary 方法:
1 2 3 4 5 6 7 8 |
NSDictionary* replacementFonts = @{ @"Helvetica-Light" : @"Unmi-Light", @"Helvetica-LightOblique" : @"Unmi-LightItalic", @"Helvetica-Bold" : @"Unmi-Bold", @"Helvetica-BoldOblique" : @"Unmi-BoldItalic" }; [UIFont setReplacementDictionary:replacementFonts]; |
来建立字体映射关系。
看了下 UIFont+Replacement.m 中,是靠 + (void) load 方法来加载的,这个方法在类文件引入到了项目中就会执行,而我们常用的类的 +(void) initialize 方法,是在第一次使用类的时候才执行,引入到了项目中还不一定算数。
本文链接 https://yanbin.blog/xcode-4-use-custom-fonts/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。