• ios »
  • iOS使用自定义字体

iOS使用自定义字体

iOS 6 自带字体:iOS 6: Font list

iOS 7 自带字体:iOS 7: Font list

OS X Mavericks 自带字体:
OS X: Fonts included with Mavericks

上面两篇文档里列出的字体名字并非编程时用的fontName,只是对应的字体文件的名字。

可以使用下面的代码查系统自带字体的 fontName,在任意 UIViewController 里加上:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    for (NSString* family in [UIFont familyNames])
    {
        NSLog(@"%@", family);
        for (NSString* name in [UIFont fontNamesForFamilyName: family])
        {
            NSLog(@"%@", name);
        }
    }
}

以下是真机 debug 在控制台打印出来的:

Thonburi
Thonburi-Bold
Thonburi
Thonburi-Light
...
Didot-Bold
Didot-Italic
Didot
DIN Alternate
DINAlternate-Bold
Bodoni 72 Smallcaps
BodoniSvtyTwoSCITCTT-Book

加入我想要在 iOS 的 UILabel 中使用 mac 中自带的Yuanti SC,怎么搞?
1.下载你想要的字体的字体文件,可以是 ttf、otf、ttc 等格式(ttc 格式需要特别注意),此处我从 mac 的系统默认字体存储目录拷贝;
2.把字体文件添加到 xcode 项目中;
2.在Info.plist添加以下代码并保存;

    
   UIAppFonts
	
		Yuanti.ttc
		WawaSC-Regular.otf
		Lantinghei.ttc
		汉仪楷体简.ttf
	
   

B261A1C3-2E8F-4006-8AFE-B4831828E225
3.在 Build Phases/Copy Bundle Resources添加字体文件;
70428009-10BC-4667-B5B7-D985179CC12F
4.使用上面 viewDidLoad 代码查找新增的 fontName,比如我添加 Yuanti.ttc 后新增了

Yuanti SC
STYuanti-SC-Light
STYuanti-SC-Bold
STYuanti-SC-Regular

最后在代码中

self.contentLabel.font = [UIFont fontWithName:@"Yuanti SC" size:16.0f];

效果:
83E5E5D7-4417-4015-BAB0-80EE6964554B

Lantinghei.tcc 下面包含8个字体。

Lantinghei TC //繁体细
FZLTXHB--B51-0 //繁体extralight
FZLTTHB--B51-0 //繁体heavy
FZLTZHB--B51-0 //繁体demibold
Lantinghei SC //简体
FZLTZHK--GBK1-0 //简体demibold
FZLTTHK--GBK1-0 //简体heavy
FZLTXHK--GBK1-0 //简体extralight

如果不适用粗体,就直接用Lantinghei SC就可以了。

ttc 字体文件是字体集合,提取 ttc 字体名方法:

-(NSArray*)customFontArrayWithPath:(NSString*)path size:(CGFloat)size
{
    CFStringRef fontPath = CFStringCreateWithCString(NULL, [path UTF8String], kCFStringEncodingUTF8);
    CFURLRef fontUrl = CFURLCreateWithFileSystemPath(NULL, fontPath, kCFURLPOSIXPathStyle, 0);
    CFArrayRef fontArray =CTFontManagerCreateFontDescriptorsFromURL(fontUrl);
    CTFontManagerRegisterFontsForURL(fontUrl, kCTFontManagerScopeNone, NULL);
    NSMutableArray *customFontArray = [NSMutableArray array];
    for (CFIndex i = 0 ; i < CFArrayGetCount(fontArray); i++){
        CTFontDescriptorRef  descriptor = CFArrayGetValueAtIndex(fontArray, i);
        CTFontRef fontRef = CTFontCreateWithFontDescriptor(descriptor, size, NULL);
        NSString *fontName = CFBridgingRelease(CTFontCopyName(fontRef, kCTFontPostScriptNameKey));
        UIFont *font = [UIFont fontWithName:fontName size:size];
        [customFontArray addObject:font];
    }
    
    return customFontArray;
}

另一种思路是直接从 ttc 提取 ttf,有待研究。

参考资料:

Tutorial: Porting fonts to the iPhone

This entry was posted in ios

  • disqus_iXItgWW5JU

    从mac里导出的字体包太大了,而实际你只要其中的几个字符,这个就不好搞了!!!

    • wingyiulee

      只要几个做成图片不就行了?