我能在iPhone应用中嵌入自定义字体吗?

791

我想制作一个应用程序以包含自定义字体以渲染文本,加载它,然后与标准的UIKit元素(如UILabel)一起使用。这是否可行?


5
在斯坦福大学的CS193p(iPhone应用程序开发)课程中,埃文指出在设备上安装自己的字体是“很费事”的,但至少这意味着这是可能的 :-) - Ilya Birman
2
iPhone 3.2 允许自定义字体,但仅限于 iPad(请参见下面的答案)。 - samvermette
6
最后,我使用了图像。 - Airsource Ltd
2
哇...经过所有这些,答案仍然是图像...难以置信。我真的希望能够实现自定义字体与系统字体具有相同的功能。唉... - d2burke
有用的教程:http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ - Suragch
1
我已经大幅削减了原问题以反映自从我提问以来过去的十年。我鼓励其他人适当地减少他们的评论和答案。 - Airsource Ltd
32个回答

0

正如之前所有回答所指出的那样,在较新版本的iOS中实现起来非常容易。

我知道这不是一个技术性的回答,但由于很多人都会犯错(从而有效地违反了许可证,如果您被起诉可能会花费您很多钱),所以让我强调一点:在iOS(或任何其他类型)应用程序中嵌入自定义字体基本上就是“再分发”该字体。大多数商业字体的许可证都禁止再分发,因此请确保您按照许可证行事。


0
作为对@bdev 答案的改进,这里是一个仅列出自定义字体的更新版本。 步骤1:使用@bdev的答案找出所有系统字体并保存到文件中。 将以下代码放在第一个视图控制器的-(void)viewDidLoad中,在[super viewDidLoad]之后(或在应用程序委托中):
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSMutableArray *system_fonts = [NSMutableArray array];
for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
        [system_fonts addObject:fontName];
    }
}
if([paths count] > 0) {
    [system_fonts writeToFile:[[paths objectAtIndex:0]
                               stringByAppendingPathComponent:@"array.out"] atomically:YES];
}

运行应用程序一次。之后停止它。

步骤2:将自定义字体添加到项目中

使用接受的答案中所示的方法,添加您的自定义字体(记得更新.plist并通过选中添加到目标将字体文件添加到构建中。

步骤3:将系统字体与当前字体列表进行比较

将步骤1中的代码替换为:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSMutableArray *system_fonts = [NSMutableArray arrayWithContentsOfFile:[[paths objectAtIndex:0]
                                                                        stringByAppendingPathComponent:@"array.out"]];

for (NSString *familyName in [UIFont familyNames]) {
    for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
        if (![system_fonts containsObject:fontName]) {
            NSLog(@"%@", fontName);
        }
    }
}

运行应用程序,将显示您添加的自定义字体列表。

这适用于iOS 3.2到iOS 6(未来版本可能也可以正常工作)。同样适用于.ttc.ttf文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接