iOS中使用自定义ttf/ttc字体,以及cocosbuilder中指定字体的方法

iOS中使用自定义ttf/ttc字体的方法,网上一搜一堆,但是还是有一些没有说清的地方,因此我认为有必要再总结整理一下。(可跳至快速总结直接看结论)

首先,明确个概念,这儿讨论的使用ttf/ttc字体的方法,是指使用iOS自建的机制渲染字体,即UIFont去渲染字体将文本生成一张贴图。因此就要符合iOS的一些既定规则。
规则有两个:1)让iOS系统找到你的字体 2)向iOS系统指定字体的名字以便创建字体。

第一个规则大家都知道,就是在info.plist中指定 UIAppFonts,即在plist编辑器中选择 Font s provided by application这项,往里面添加item,每个item是一个ttf文件名。
官方文档对于UIAppFonts的解释是:
UIAppFonts ( Array - iOS) specifies any app-provided fonts that should be made available through the normal mechanisms. Each item in the array is a string containing the name of a font file (including filename extension) that is located in the app’s bundle. The system loads the specified fonts and makes them available for use by the app when that app is run
[来源:https://developer.apple.com/library/ios/documentation/General/Reference/InfoPlistKeyReference/Introduction/Introduction.html]
这儿说的是我们要填一个字体文件的名字,包括后缀,例如:font1.ttf。其实这儿有一个问题没说,这个ttf文件应该放在哪儿?官方文档只说是在bundle里面,当然我们放在bundle的根目录是没问题的,很多人都是这么做的,但是如果我们想放在子目录呢?例如res/fonts里面。其实在这儿可以填相对路径,比如res/fonts/font1.ttf,这样系统也可以找到字体文件。
另一个问题是,如果我想下载字体行不行?比如说字体太大了,我不想打到bundle里面。按照官方文档,显然是不行啊,他只会去bundle里面按照我们填的路径去找字体文件,不会去app的Documents目录里面找。但是有一些游戏貌似是可以下载的,他们怎么实现的呢?我想他们应该没有使用iOS系统的内建机制去渲染字体,而是使用freetype等可以解析ttf的库去渲染。
这儿还有个问题要提醒,有时候发现字体在模拟器上可以用,但真机上没有,很可能是字体并没有打进去,但是你安装了字体,这样在模拟器上还是可以找到这个字体的。
另外,除了ttf文件,我们还可以使用ttc文件,ttc是ttf的集合,一个ttc中可以包含多个font family。

第二个规则:我们看创建UIFont的接口:[UIFont fontWithName:fntName size:nSize]; 这儿的fntName是什么呢?请看官方文档:
fontName
    The fully specified name of the font. This name incorporates both the font family name and the specific style information for the font.
[来源:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIFont_Class/Reference/Reference.html#//apple_ref/occ/clm/UIFont/fontWithName:size:]

即font family name或者specific style information。我们正常在字体册里面是看不到这两个名字的,可以用一个小程序查看:

void printAllFonts()
{
    NSArray *familyNames = [[NSArray alloc] initWithArray:[UIFont familyNames]];
    NSArray *fontNames;
    
    NSInteger indFamily, indFont;
    
    for(indFamily=0; indFamily<[familyNames count]; ++indFamily)
    {
        NSLog(@"Family name:%@", [familyNames objectAtIndex:indFamily]);
        
        fontNames = [[NSArray alloc] initWithArray:[UIFont fontNamesForFamilyName:[familyNames objectAtIndex:indFamily]]];
        
        for(indFont=0; indFont<[fontNames count]; ++indFont)
        {
            NSLog(@"\tFont name:%@",[fontNames objectAtIndex:indFont]);
        }
        
        [fontNames release];
    }
    
    [familyNames release];
}

这个会输出系统中所有字体的family name和font name.例如:

Family name:Heiti SC
    Font name:STHeitiSC-Medium
    Font name:STHeitiSC-Light

Family name:FZChaoCuHei-M10S
    Font name:FZCCHJW--GB1-0

FZChaoCuHei-M10S 是一个自己添加的ttf字体。一般我们用family name就可以。


附加福利:在cocos builder中指定ttf字体

cocos builder中是有User Fonts这一项的,可以选择资源里面的ttf文件,但是如果你选了一个例如 font1.ttf 进去,你回发现根本没用,cocos builder自己都显示不了,游戏中也是不行。

其实也还是有办法的,就是直接将font family name作为ttf文件名,例如 FZChaoCuHei-M10S.ttf作为文件名,再在cocos builder里面选择,就可以了。


快速总结:
1) Font s provided by application 可以使用相对路径,把ttf/ttc字体放在bundle的子目录中,例如:res/fonts/font1.ttf
2) 使用iOS内建机制UIFont则不能把字体下载下来再使用,如果需要可使用freetype自己去实现字体的渲染
3)除了ttf文件,我们还可以使用ttc文件,ttc是ttf的集合,一个ttc中可以包含多个font family。
4)Cocos Builder中设置自定义ttf字体,需要使用font family name作为ttf文件名。

你可能感兴趣的:(iOS中使用自定义ttf/ttc字体,以及cocosbuilder中指定字体的方法)