我可以在 iPhone 应用程序中嵌入自定义字体吗?

Can I embed a custom font in an iPhone application?

提问人:Airsource Ltd 提问时间:12/12/2008 最后编辑:Airsource Ltd 更新时间:6/10/2019 访问量:240568

问:

我想让一个应用程序包含用于呈现文本的自定义字体,加载它,然后将其与标准元素一起使用,例如 .这可能吗?UIKitUILabel

iOS Cocoa-Touch 字体

评论

5赞 Ilya Birman 4/24/2009
在斯坦福大学的一次CS193p(iPhone应用程序开发)讲座中,Evan指出,在设备上安装自己的字体是“大量的工作”,这至少意味着这是可能的:-)
2赞 samvermette 4/11/2010
iPhone 3.2 允许自定义字体,但仅适用于 iPad(请参阅下面的答案)
6赞 Airsource Ltd 4/29/2010
最后我使用了图像。
2赞 d2burke 9/18/2012
哇。。。毕竟,答案仍然是图像......难以置信。我真的希望自定义字体的可靠实现具有与系统字体相同的功能。唉。。。
1赞 Airsource Ltd 6/10/2019
我大幅删减了原来的问题,以反映自我提出这个问题以来已经过去了十年。我鼓励其他人适当地修剪他们的评论和答案。

答:

21赞 August 12/12/2008 #1

是的,您可以包含自定义字体。请参阅 UIFont 上的文档,特别是方法。fontWithName:size:

1) 确保将字体包含在您的资源文件夹中。

2)字体的“名称”不一定是文件名。

3) 确保您拥有使用该字体的合法权利。通过将其包含在您的应用程序中,您也在分发它,并且您需要有权这样做。

评论

0赞 Airsource Ltd 12/12/2008
你真的成功了吗?我无法让它工作,谷歌搜索只会找到其他尝试过但失败的人。
0赞 August 12/12/2008
是的。我有。同样,请确保您使用的是正确的字体名称。
1赞 Keith Fitzgerald 2/19/2009
当你说“字体的'名称'不一定是文件名”时......如何找到正确的名称?
7赞 Jonathan Sterling 4/11/2010
是的,这个答案是错误的。你不能开箱即用。
0赞 Cbas 6/6/2016
iOS 9 更新,UIFont 文档没有提到任何关于自定义字体的内容
27赞 Genericrich 12/16/2008 #2

我是这样做的:

加载字体:

- (void)loadFont{
  // Get the path to our custom font and create a data provider.
  NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"mycustomfont" ofType:@"ttf"]; 
  CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);

  // Create the font with the data provider, then release the data provider.
  customFont = CGFontCreateWithDataProvider(fontDataProvider);
  CGDataProviderRelease(fontDataProvider); 
}

现在,在你的 中,做这样的事情:drawRect:

-(void)drawRect:(CGRect)rect{
    [super drawRect:rect];
    // Get the context.
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextClearRect(context, rect);
    // Set the customFont to be the font used to draw.
    CGContextSetFont(context, customFont);

    // Set how the context draws the font, what color, how big.
    CGContextSetTextDrawingMode(context, kCGTextFillStroke);
    CGContextSetFillColorWithColor(context, self.fontColor.CGColor);
    UIColor * strokeColor = [UIColor blackColor];
    CGContextSetStrokeColorWithColor(context, strokeColor.CGColor);
    CGContextSetFontSize(context, 48.0f);

    // Create an array of Glyph's the size of text that will be drawn.
    CGGlyph textToPrint[[self.theText length]];

    // Loop through the entire length of the text.
    for (int i = 0; i < [self.theText length]; ++i) {
        // Store each letter in a Glyph and subtract the MagicNumber to get appropriate value.
        textToPrint[i] = [[self.theText uppercaseString] characterAtIndex:i] + 3 - 32;
    }
    CGAffineTransform textTransform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
    CGContextSetTextMatrix(context, textTransform);
    CGContextShowGlyphsAtPoint(context, 20, 50, textToPrint, [self.theText length]);
}

基本上,您必须在文本中进行一些蛮力循环,并使用幻数来模糊以在字体中找到您的偏移量(在这里,请参阅我使用 29),但它有效。

此外,您必须确保字体在法律上是可嵌入的。大多数不是,而且有专门从事此类事情的律师,所以要小心。

评论

1赞 Airsource Ltd 12/16/2008
我确信它确实运行良好,但我(真的)不想编写自己的布局引擎来处理 UILabel 和 UITextView 目前为我所做的一切——尤其是换行、定位和编辑。
1赞 Martin Cote 12/9/2009
AFAICS,这仅适用于大写字符,因此调用“uppercaseString”。
2赞 Martin Cote 12/9/2009
我投了反对票,因为“神奇数字”技巧是一种纯粹的黑客,并不真正有效。真正的解决方案是从 TTF 文件中获取 cmap 表。
1赞 Ivan Vučica 8/24/2012
这是关于直接在 Core Graphics 中使用字体的简洁信息。只是为了为未来的读者更新:在较新的操作系统中,人们可以而且应该使用核心文本。或者,可以使用 -- 尽管它不适用于 UTF-8。CGContextShowTextAtPoint()
5赞 Matt Sephton 4/9/2009 #3

ATSApplicationFontsPath

一个简单的 plist 条目,允许您将字体文件包含在您的应用程序资源文件夹中,它们在您的应用程序中“正常工作”。

评论

0赞 Airsource Ltd 4/9/2009
你在设备上试过这个吗?我没有喜悦,谷歌搜索表明 iPhone 不支持这个 plist 条目,尽管它记录了 iPhone 操作系统。
1赞 Matt Sephton 4/9/2009
对不起,我目前只在OS X应用程序中使用它。
8赞 John 4/28/2009 #4

它还没有发布,但下一个版本的 cocos2d(2D 游戏框架)将支持可变长度的位图字体作为字符映射。

http://code.google.com/p/cocos2d-iphone/issues/detail?id=317

作者没有确定这个版本的发布日期,但我确实看到一个帖子表明它将在未来一两个月内发布。

300赞 commanda 5/1/2009 #5

编辑:从iOS 3.2开始,此功能是内置的。如果需要支持 3.2 之前版本,仍可使用此解决方案。

我创建了一个简单的模块来扩展和处理加载 .ttf 文件。我在 Apache 许可下将其开源发布,并将其放在 github 上。UILabel

重要文件是 和 。FontLabel.hFontLabel.m

它使用了 Genericrich 答案中的一些代码。

在此处浏览源代码

  • 将字体文件复制到资源中

  • 将名为 UIAppFonts 的键添加到文件中。(“应用程序提供的字体”)Info.plist

  • 将此键设为数组

  • 对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目

  • Info.plist

  • 现在,在您的应用程序中,您可以简单地调用以获取自定义字体以与您的 和 等一起使用...[UIFont fontWithName:@"CustomFontName" size:15]UILabelsUITextViews

详细信息

评论

2赞 4thSpace 6/15/2009
我试过使用你的代码,但它经常崩溃,具体取决于字体。例如,尝试使用此处 fontspace.com/category/tiki 中的非洲字体或 Tiki 字体。
2赞 teepusink 11/15/2009
这个库效果很好。不过,我需要垂直间距方面的帮助。不知道该怎么做。所以我有这个消息.numberOfLines = 3;如何控制第 1 行、第 2 行和第 3 行之间的垂直间距?谢谢你,Tee
2赞 Parth Bhatt 1/28/2013
@commanda Hello commanda,您在答案中提供的链接似乎不可用。
5赞 commanda 1/29/2013
@ParthBhatt 您应该使用 stackoverflow.com/a/2616101/21447 中提供的解决方案,而不是 FontLabel,因为此功能现在由 CocoaTouch 提供。
2赞 Lily Ballard 5/11/2013
@ParthBhatt:我不知道为什么 repo 不再托管在 zynga 上,但它可以在 github.com/kballard/fontlabel 上使用
36赞 rpetrich 5/1/2009 #6

编辑:从iOS3.2开始,此答案已失效;使用 UIAppFonts

我能够成功加载自定义的唯一方法是通过私有 GraphicsServices 框架。UIFont

以下命令将加载应用程序主包中的所有字体:.ttf

BOOL GSFontAddFromFile(const char * path);
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
        newFontCount += GSFontAddFromFile([fontFile UTF8String]);
    return newFontCount;
}

加载字体后,可以像 Apple 提供的字体一样使用它们:

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
[label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]];

GraphicsServices 甚至可以在运行时加载,以防将来 API 消失:

#import <dlfcn.h>
NSUInteger loadFonts()
{
    NSUInteger newFontCount = 0;
    NSBundle *frameworkBundle = [NSBundle bundleWithIdentifier:@"com.apple.GraphicsServices"];
    const char *frameworkPath = [[frameworkBundle executablePath] UTF8String];
    if (frameworkPath) {
        void *graphicsServices = dlopen(frameworkPath, RTLD_NOLOAD | RTLD_LAZY);
        if (graphicsServices) {
            BOOL (*GSFontAddFromFile)(const char *) = dlsym(graphicsServices, "GSFontAddFromFile");
            if (GSFontAddFromFile)
                for (NSString *fontFile in [[NSBundle mainBundle] pathsForResourcesOfType:@"ttf" inDirectory:nil])
                    newFontCount += GSFontAddFromFile([fontFile UTF8String]);
        }
    }
    return newFontCount;
}

评论

0赞 pixel 7/15/2009
请注意,这确实有效,但您需要在使用字体之前调用 loadFonts - 它们似乎不会在整个应用程序中保持加载状态
0赞 M. Ryan 11/13/2009
在 OS 3.0 中,您肯定需要使用第二个示例,不要忘记导入。对我来说效果很好。
0赞 pixel 12/2/2009
另一个注意事项 -- 这是一个私有框架,并动态加载它......这两者都可能会阻止您的应用程序被 AppStore 接受。
0赞 Raj Pawan Gumdal 4/14/2010
结论是什么?这种方法有什么替代方案?
1赞 Luke Mcneice 1/17/2011
SHould 还注意到,对于我尝试过的任何自定义字体,宽度和高度都返回 0。[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];
6赞 ByteNirvana 5/1/2009 #7

也许作者忘了给字体起一个 Mac FOND 名称

  1. FontForge 中打开字体,然后转到 Element>Font Info
  2. 有一个“Mac”选项,您可以在其中设置 FOND 名称。
  3. 在“文件>导出字体”下,您可以创建一个新的 ttf

您也可以尝试导出对话框中的“Apple”选项。

免责声明:我不是iPhone开发人员!

6赞 Jacob Wallström 10/28/2009 #8

我一直在iOS 3.1.2上尝试此页面上的各种建议,这些是我的结论:

即使使用 FontForge 设置了 FOND 名称,简单地使用 Resources 目录中的字体也无法正常工作。[UIFont fontWithName:size:]

[UIFont fontWithName:size:]如果首先使用 GSFontAddFromFile 加载字体,则将起作用。但不是 iOS 3.1.2 的一部分,因此必须按照 @rpetrich 的描述动态加载。GSFontAddFromFile

646赞 samvermette 4/11/2010 #9

iOS 3.2 及更高版本支持此功能。直接来自 iPhone OS 3.2 中的新功能文档:

自定义字体支持
想要使用自定义字体的应用程序现在可以将这些字体包含在其应用程序包中,并通过在其 Info.plist 文件中包含 UIAppFonts 键来向系统注册这些字体。此键的值是一个字符串数组,用于标识应用程序捆绑包中的字体文件。当系统看到该键时,它会加载指定的字体并使其可供应用程序使用。

在 中设置字体后,您可以像在 IB 中以任何其他字体一样使用自定义字体,也可以以编程方式使用。Info.plist

Apple 开发者论坛上有一个正在进行的主题:
https://devforums.apple.com/thread/37824(需要登录)

这是一个关于如何实现这一点的优秀而简单的 3 步教程(已删除断开的链接)

  1. 使用 Xcode 作为资源将自定字体文件添加到项目中
  2. 将名为 .Info.plistUIAppFonts
  3. 将此键设为数组
  4. 对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为数组中的项UIAppFonts
  5. Info.plist
  6. 现在,在您的应用程序中,您可以简单地调用以获取自定义字体以用于 UILabelsUITextViews 等...[UIFont fontWithName:@"CustomFontName" size:12]

另外:确保字体位于 Copy Bundle Resources 中。

评论

14赞 pm_labs 9/20/2010
以下是iOS4的分步教程: blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
15赞 Willster 1/29/2011
本教程非常好。shang-liang.com/blog/custom-fonts-in-ios4重要的是,[UIFont fontWithName:...] 的 NSString 参数是字体的操作系统名称,而不是文件名。
153赞 Daniel Wood 3/21/2012
在其他人花费 3 个小时安装 fontforge 以找到 iOS 所需字体的实际 postscript 名称之前。我要指出的是,您只需在字体簿中的字体上按 Cmd+I 即可找到此信息。
42赞 Steve Potter 3/30/2012
在努力获得正确的字体名称之后,我只是列出了已安装的字体并找到了它。很有帮助。代码如下: for ( NSString *familyName in [UIFont familyNames] ) { NSLog(@“Family %@”, familyName);NSLog(@“名称 = %@”, [UIFont fontNamesForFamilyName:familyName]);}
26赞 Mickey 12/20/2012
如果你的代码不起作用,请确保你发现字体文件出现在“Build Phases”->“Copy Bundle Resouces”中
117赞 alexey 7/8/2010 #10

iOS 4 中使用自定义字体有一种简单的方法。

  1. 将字体文件(例如,)添加到 XCode 中项目的 Resources 文件夹中。Chalkduster.ttf
  2. 打开并添加一个名为 的新密钥。此键的类型应为 array。info.plistUIAppFonts
  3. 将您的自定义字体名称添加到此数组中,包括扩展名 ()。Chalkduster.ttf
  4. 现在,您可以在应用程序中使用。[UIFont fontWithName:@"Chalkduster" size:16]

不幸的是,IB不允许使用自定义字体初始化标签。请参阅此问题以解决此问题。我最喜欢的解决方案是使用自定义子类:UILabel

@implementation CustomFontLabel

- (id)initWithCoder:(NSCoder *)decoder
{
    if (self = [super initWithCoder: decoder])
    {
        [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]];
    }
    return self;
}

@end

评论

3赞 Jesse Rusak 10/20/2010
这似乎支持回到 3.2,而不仅仅是 4.0+
1赞 Joe D'Andrea 8/1/2011
谢谢!我一直遇到的问题是,与内置字体相比,自定义字体似乎有点偏高(下面的额外空间)。我尝试使用来自 GitHub 的 FontLabel 存储库,它有时会有所帮助,但不是所有时候都有帮助。
12赞 slayton 8/22/2011
值得注意的是,传递给 UIFont 构造函数的字符串不是文件名减去扩展名,而是字体的内部名称。我在加载文件名缩短的字体时遇到问题。当我使用文件中包含的整个字体名称时,字体加载正常。
5赞 electromaggot 11/20/2011
斯雷顿刚才说的话很关键。[UIFont fontWithName:需要字体的“全名”,通过在“字体册”中打开它并选择以下选项来查看:预览 --> 显示字体信息
10赞 Nano 12/7/2010 #11

在查找器中找到TTF,然后单击“获取信息”。在标题“全名:”下,它给了我一个名字,然后我使用了这个名字(我只是复制并粘贴了确切的名称,在这种情况下不需要“.ttf”扩展名)。fontWithName

8赞 user576862 1/16/2011 #12

一个重要的注意事项:您应该使用与字体相关的“PostScript名称”,而不是其全名或姓氏。此名称通常与字体的正常名称不同。

5赞 RichX 3/16/2011 #13

更好的解决方案是将新属性“”添加到文件中。Fonts provided by applicationinfo.plist

然后,您可以像往常一样使用自定义字体。UIFont

12赞 5566 3/22/2011 #14

这是如何操作的分步说明。不需要额外的库或任何特殊的编码。

http://shang-liang.com/blog/custom-fonts-in-ios4/

大多数情况下,问题出在字体上,而不是方法上。最好的方法是使用一种肯定会起作用的字体,例如 verdana 或 geogia。然后更改为所需的字体。如果它不起作用,可能是字体名称不正确,或者字体不是格式良好的字体。

5赞 Jarson 12/30/2011 #15

对于 iOS 3.2 及更高版本: 使用上述几种方法,它们是:

  1. 将字体文件(例如,Chalkduster.ttf)添加到 XCode 中项目的 Resources 文件夹中。
  2. 打开 info.plist 并添加一个名为 UIAppFonts 的新项。此键的类型应为 array。
  3. 将您的自定义字体名称添加到此数组,包括扩展名(“Chalkduster.ttf”)。
  4. 在您的应用程序中使用。[UIFont fontWithName:@"Real Font Name" size:16]

“真实字体名称”并不总是您在字体手册中看到的字体名称。最好的方法是询问您的设备它看到哪些字体以及确切的名称是什么。

我使用发布在以下位置的uifont-name-grabber: uifont-name-grabber

只需将您想要的字体拖放到 xcode 项目中,将文件名添加到其 plist 中,然后在您正在构建的设备上运行它,它就会使用预期的名称通过电子邮件向您发送完整的字体列表。UIFont fontWithName:

20赞 SKris 3/28/2012 #16

如果您使用的是 ,则必须根据线程中的 https://stackoverflow.com/users/1292829/arne添加到 Custom Fonts Xcode 4.3 的下方。这对我有用,以下是我为自定义字体在我的应用程序中工作所采取的步骤:xcode 4.3fontBuild PhaseCopy Bundle Resources

  1. 将字体添加到项目中。我将(或)文件拖放到我创建的新组中,并接受了 xcode 选择的 .OTFTTFcopying the files over to the project folder
  2. 创建数组时,您的字体将作为数组中的项目列出。只是 ,而不是扩展名(例如 “”、“”)。UIAppFontsnamesGothamBoldGothamBold-Italic
  3. 单击屏幕左侧顶部的方式。project nameProject Navigator
  4. 单击出现在 xcode 主区域中的选项卡。Build Phases
  5. 展开“”部分,然后单击以添加字体。Copy Bundle Resources"+"
  6. 从文件导航器中选择字体文件,单击时会弹出打开。"+"
  7. 对您必须的每种字体执行此操作。add to the project
12赞 kumar123 3/30/2012 #17

在现有的 iOS 应用程序上添加新字体非常容易。

您只需要将字体(例如 font.ttf)添加到您的资源文件夹中。

打开您的应用程序。添加新行作为“应用程序提供的字体”,并将字体名称键入为 font.ttf。info.plist

并在设置字体时执行setFont:"corresponding Font Name"

您可以通过 检查您的字体是否被添加。NSArray *check = [UIFont familyNames];

它返回应用程序支持的所有字体。

5赞 AaronBaker 9/4/2012 #18

我已将此页面上的一些建议组合成适合我在 iOS 5 上的建议。

首先,您必须将自定义字体添加到您的项目中。然后,您需要遵循@iPhoneDev的建议,并将字体添加到您的 info.plist 文件中。

执行此操作后,这将起作用:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];

但是,您需要知道字体的 Postscript 名称。只需遵循 @Daniel Wood 的建议,在 FontBook 中按 command-i 即可。

然后,享受您的自定义字体。

5赞 Alejandro Luengo 9/26/2012 #19

首先将 .odt 格式的字体添加到您的资源中,在本例中,我们将使用 DINEngschriftStd.otf,然后使用此代码将字体分配给标签

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];

要确保您的字体已加载到项目中,只需调用

NSLog(@"Available Font Families: %@", [UIFont familyNames]);

在 .plist 上,必须声明字体。只需添加“应用程序提供的字体”记录,并添加带有字体名称的项目 0 字符串 (DINEngschriftStd.otf)

51赞 bdev 10/17/2012 #20

在 Info.plist 中,添加条目“应用程序提供的字体”,并将字体名称作为字符串包含:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...

然后通过运行以下命令来检查以确保包含您的字体:

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

请注意,ttf 文件名可能与设置标签字体时使用的名称不同(可以使用上面的代码获取“fontWithName”参数):

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];
2赞 Nishan29 10/23/2012 #21

您可以在 resources 文件夹中添加所需的“FONT”文件。然后转到项目文件并使用 KEY“应用程序提供的字体”和值作为“字体名称”。Info.plist

然后,您可以调用该方法[UIFont fontwithName:@"FONT NAME" size:12];

评论

0赞 Hoshi 5/25/2023
文件名,而不是字体名称...
1赞 ElizaS 1/28/2013 #22

我使一切成为可能,但是新字体没有出现,所以我找到了解决方案:

当您拖动 fot 文件(otf 或 ttf)时,不要忘记选中“添加到目标”下的复选框。

完成后,您的字体将出现,一切正常。

7赞 Kirtikumar A. 3/9/2013 #23

按照此步骤操作

1)在项目中复制字体

2)以源代码模式打开文件...(注意 - 不要打开.plistinfo.plist)

3)在此之前 - 右键单击您的字体并在 fontforge 或类似的编辑器中打开它,并在您的系统中打开它,它应该是installinstall

4)输入这个

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>

5)在您的class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];

这里的 lblPoints 将根据您的情况进行更改UILabel

做!! 如果您的字体仍然无法正常工作,请先检查您的字体兼容性

评论

1赞 Raptor 8/12/2013
为什么不打开?info.plist
0赞 jayant rawat 4/24/2020
为什么在第 5 点的 Myraid 和 Pro 之间有空间,而第 4 点的 Plist 中没有空间?
0赞 Kirtikumar A. 5/1/2020
@jayantrawat 它的字体名称,在我们安装字体后显示在系统中,而 .plist 是字体文件的名称[ .ttl 或 otf ]
0赞 Kirtikumar A. 5/2/2020
@jayantrawat如果我的解决方案有帮助,请请求您放弃对答案的赞成票,以便其他用户可以以同样的方式获得帮助
0赞 jayant rawat 5/4/2020
@KirtikumarA。我已经使用教程做到了.我的字体名称中只有一个拼写错误。我只是好奇为什么您在字体名称的第 5 点有一个空格,而在 plist 的第 4 点没有空格。无论如何,仍然对你的回答投了赞成票,这在现在很少见了。
3赞 David M. 3/20/2013 #24

从 iOS 4.1 开始,有一种使用自定义字体的新方法。它允许您动态加载字体,无论是来自应用程序中包含的文件、下载的数据还是您拥有的内容。它还允许您根据需要加载字体,而旧方法在应用程序启动时加载所有字体,如果您有许多字体,这可能需要很长时间。

新方法在 ios-dynamic-font-loading 中进行了描述

您可以使用该函数,为其提供包含字体数据的缓冲区。然后,它可用于 Web 视图,就像使用旧方法一样。下面是该链接中的示例代码:CTFontManagerRegisterGraphicsFontUIFont

NSData *inData = /* your font-file data */;
CFErrorRef error;
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)inData);
CGFontRef font = CGFontCreateWithDataProvider(provider);
if (! CTFontManagerRegisterGraphicsFont(font, &error)) {
    CFStringRef errorDescription = CFErrorCopyDescription(error)
    NSLog(@"Failed to load font: %@", errorDescription);
    CFRelease(errorDescription);
}
CFRelease(font);
CFRelease(provider);

评论

0赞 Hiren 4/10/2013
我使用了这段代码,但收到>错误无法加载字体:无法完成操作。(com.apple.coretext 错误 105 - 无法注册 CGFont '<CGFont (0x14fe7df0): Shruti>')
0赞 David M. 4/22/2013
根据文档,错误 105 是 ,“文件已在指定范围内注册。developer.apple.com/library/ios/#documentation/Carbon/Reference/......kCTFontManagerErrorAlreadyRegistered
1赞 Bharat Gulati 5/11/2013 #25

虽然上面的一些答案是正确的,但我为仍然有字体问题的人写了一个详细的视觉教程。

上面的解决方案告诉您将字体添加到plist并使用

[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

是正确的。请现在使用任何其他黑客方式。如果您仍然在查找字体名称和添加它们时遇到问题,这里是教程 -

在 ios 应用程序中使用自定义字体

评论

0赞 ari gold 6/9/2013
我刚刚试过这个。似乎有效,但我的字体很小,无论我设置什么大小。值得一提的是,我使用的是免费提供的 OTF 文件:philsfonts.com/index.php/free_fonts
0赞 Bharat Gulati 6/27/2013
尝试使用任何其他自定义字体,如果问题仍然存在,请告诉我。如果它以这种方式工作,那么您的字体有问题。
0赞 Raptor 8/12/2013 #26

作为增强@bdev的答案,这里是一个更新版本,仅列出自定义字体。

第 1 步:使用 @bdev 的答案找出所有系统字体并保存到文件。

将以下代码放在第一个视图控制器的 、之后(或 App Delegate 中):-(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 步:将自定义字体添加到项目

使用已接受答案中显示的方法,添加您的自定义字体 ( 请记住通过选中 来更新并添加要构建的字体文件。.plistAdd To Target

第 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

1赞 user2691469 12/11/2013 #27

是的,您可以在应用程序中使用自定义字体

一步一步地遵循那里:

  • 将自定义字体文件添加到支持文件中的项目
  • 将名为 UIAppFonts 的键添加到文件中。Info.plist
  • 将此键设为数组
  • 对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目
  • 立即保存在您的应用程序中,您只需调用即可获取自定义字体以用于您的Info.plist[UIFont fontWithName:@"your Custom font Name" size:20]UILabels

应用后,如果您没有得到正确的字体 然后你双击自定义字体,仔细看看顶部的字体名称是来的 并复制此字体,粘贴,在这里希望您能得到正确的答案[UIFont fontWithName:@" here past your Custom font Name" size:20]

1赞 Akhil Bhadauria 3/26/2014 #28

是的,您可以在应用程序中使用自定义字体

一步一步地遵循那里:

将自定义字体文件添加到支持文件中的项目

将密钥添加到名为 UIAppFonts 的 Info.plist 文件。

将此键设为数组

对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目

保存 Info.plist 现在,在应用程序中,只需调用 [UIFont fontWithName:@“your Custom font Name” size:20] 即可获取用于 UILabels 的自定义字体 应用后,如果你没有得到正确的字体,那么你双击自定义字体,仔细看到顶部的字体名称即将到来并复制这个字体,粘贴,这里[UIFont fontWithName:@“这里过去了你的自定义字体名称”大小:20]

我希望你能得到正确的答案

34赞 Dima Deplov 9/2/2014 #29

使用 + 和 +,您可以轻松做到这一点。步骤如下:iOS 8Xcode 6

1)将字体拖放到“支持文件”文件夹中。不要忘记在“添加到目标”部分标记您的应用。从这一刻起,您可以使用此字体并从字体托盘中选择它。XcodeIB

enter image description here

2) 要使此字体在您的设备中可用,请打开您的 并添加密钥。它将包含项目 0 键,您必须添加您的字体名称作为值。字体名称可能与字体文件名不同。但首先,在大多数情况下,尝试添加您的文件名。info.plistFonts provided by application

enter image description here

如果没有,这篇文章总是对我有帮助。

以下是本文中代码的快速片段,可帮助您找到字体名称。

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


       for name in UIFont.fontNamesForFamilyName(family.description)
       {
           println("  \(name)")
       }

   }

}

编辑

我想提一下,您需要将字体文件添加到目标的构建阶段复制捆绑包资源。没有它,您将无法在设备上看到您的字体。这可能会导致意外行为。

例如,当有自定义字体时,我遇到了一个 ,但此字体不在 Copy Bundle Resources 中。当我开始使用这个时,在调用函数之前有大约 4 秒的延迟。解决字体问题消除了这种延迟。所以,建议检查两次。(rdar://20028250)顺便说一句,我无法重现该错误,但我确定问题出在字体上。bugUITextFieldviewcontrollertextfieldviewDidLoad

评论

1赞 E. Rivera 4/16/2015
只是一个笔记。即使在 IB 中正确配置了自定义字体,LaunchScreens 中也不可用。这可能是逻辑。
0赞 Dima Deplov 4/18/2015
@Rivera哇,很棒的笔记!不知道。我认为可能的替代方案是将 UIImage 与文本一起使用。
0赞 spongessuck 1/5/2016
@Rivera,感谢您提供的信息 - 它是否记录在任何地方?我反复复习这些步骤,以为我错过了一步。
0赞 Dima Deplov 1/5/2016
@spongessuck不确定您的问题,但有一些文档 developer.apple.com/library/ios/documentation/StringsTextFonts/......
14赞 Chris Klingler 9/30/2015 #30

我建议在这里遵循我最喜欢的简短教程之一:此信息来自 http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/

步骤1 - 将.ttf或.otf从Finder拖到项目中

注意 - 确保在主应用程序目标上单击“添加到目标”框

Drag font files into your project and click to add them to your target

如果您忘记单击以将其添加到目标中,请单击项目层次结构中的字体文件,然后在右侧面板上单击“目标成员资格”部分中的主应用程序目标

how to add fonts to app target if you forgot

要确保您的字体是应用目标的一部分,请确保它们在构建阶段显示在 Copy Bundle 资源

how to check resources to see if fonts are part of app target

第 2 步 - 将字体文件名添加到您的 Plist

转到“信息”部分中的“自定义iOS目标属性”,然后向该部分中的项目添加一个键,称为(在键入时,您应该看到它作为一个选项出现,并且它会将自己设置为数组。单击小箭头以打开数组项,然后键入已添加的 .ttf 或 .otf 文件的名称,以便让应用知道这些是你希望可用的字体文件Fonts provided by application

注意 - 如果您的应用程序在此步骤后立即崩溃,请检查您在此处添加的项目上的拼写

example plist with custom fonts added

第 3 步 - 找出字体的名称,以便您可以调用它们

很多时候,应用程序看到的字体名称与你认为的基于该字体的文件名的字体名称不同,请将其放在代码中,并查看应用程序创建的日志,以查看要在代码中调用的字体名称

迅速

for family: String in UIFont.familyNames(){
  print("\(family)")
  for names: String in UIFont.fontNamesForFamilyName(family){
      print("== \(names)")
  }
}

目标 C

for (NSString* family in [UIFont familyNames]){
    NSLog(@"%@", family);
    for (NSString* name in [UIFont fontNamesForFamilyName: family]){
        NSLog(@"  %@", name);
    }
}

您的日志应如下所示:

Example of searching log to find font names

第 4 步 - 使用第 3 步中的名称使用新的自定义字体

迅速

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)

目标 C

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
3赞 Daniel Krom 10/29/2015 #31

Swift,代码方式:(也适用于 swift 2.0)

将所需的字体添加到您的项目中(就像添加图像一样,只需拖拽到 Xcode),确保它们针对您的项目
添加此方法并加载自定义字体(推荐于
appDelegate didFinishLaunchingWithOptions)

func loadFont(filePath: String) {

    let fontData = NSData(contentsOfFile: filePath)!

    let dataProvider = CGDataProviderCreateWithCFData(fontData)
    let cgFont = CGFontCreateWithDataProvider(dataProvider)!

    var error: Unmanaged<CFError>?
    if !CTFontManagerRegisterGraphicsFont(cgFont, &error) {
        let errorDescription: CFStringRef = CFErrorCopyDescription(error!.takeUnretainedValue())
        print("Unable to load font: %@", errorDescription, terminator: "")
    }

}

使用示例:

if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){
      loadFont(fontPath)
}

使用字体:

UIFont(name: "My-Font", size: 16.5)

评论

0赞 Jesse Onolemen 8/4/2016
只是想知道,你为什么不在你的 Info.plist 中添加字体似乎需要更多的工作来做同样的事情。
0赞 DrMickeyLauer 10/11/2017 #32

正如之前的所有答案所表明的那样,这很有可能,而且在较新的iOS版本中也很容易。

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