Xcode 4 中使用自定义字体,非 Outlet 方式

在 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,如下图:

xcode-custom-fonts

我找到了 Helvetica 正好有几种 Style 能与我的自定义字体进行一一映射,依据上面的 ReplacementFonts 配置,当你设置的字体是 Helvetica-Light 就会应用  Unmi-Light 字体,Helvetica-LightOblique 会变成 Unmi-LightItalic,等等.....

xcode-helvetica-fonts

上图是在 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 中的:

ARC 化为

现在跑一下你的应用,看看字体是不是达到你的预期了。你可以在 Controller 的  viewDidLoad 中用:

输出 label 当前的字体,成功的话就会变成自定义的字体,而非 Interface Builder 中设置的字体。

如果你还想更懒的话,甚至有时候都不想去 Interface Builder 为某个控件选择一个特别的字体,那你可以用 System, System Bold 和 System Italic 字体,如下图:

xcode-system-fonts

默认情况下,System 采用了 Helvetica 字体,但我觉得这不太可靠的,说不定哪里 Apple 把 隶书 作为系统字体呢,这当然不可能,就是要让你别太放心用 System 字体。System 的三种字形的字体名依次对应如下:

Helvetica
Helvetica-Bold
Helvetica-Oblique

所以你可以对以上三种字体建立到自定义字体的映射,比如让 Helvetica 映射到 Unmi-Light 字体,那么通常情况下,你在 Interface Builder 里字型选择上可以无所作为,字号选择恐怕经常是免不了的。

除了可在 Xxx-Info.plist 文件中用 ReplacementFonts 建立映射关系,也可编程方式在程序运行早期调用 UIFont(Replacement) 的 setReplacementDictionary 方法:

来建立字体映射关系。

看了下 UIFont+Replacement.m 中,是靠 + (void) load 方法来加载的,这个方法在类文件引入到了项目中就会执行,而我们常用的类的 +(void) initialize 方法,是在第一次使用类的时候才执行,引入到了项目中还不一定算数。

类别: iOS. 标签: , . 阅读(1,054). 订阅评论. TrackBack.

Leave a Reply

Be the First to Comment!

avatar