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


772

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


5
在Stanford的CS193p(iPhone应用程序开发)演讲中,Evan指出在设备上安装自己的字体是“繁重的工作”,这至少意味着有可能:-)
Ilya Birman,2009年

2
iPhone 3.2允许自定义字体,但仅iPad(请参阅下面的答案)
samvermette 2010年

6
最后我使用了图像。
Airsource Ltd 2010年

2
哇...毕竟,答案仍然是图像...令人难以置信。我确实希望能够以与系统字体相同的功能可靠地实现自定义字体。
las

1
我已经对原始问题进行了实质性的调整,以反映自我提出问题以来已经过去的十年。我鼓励其他所有人适当地调整他们的评论和答案。
Airsource Ltd

Answers:


646

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

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

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

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

这是关于如何实现此目标的出色且简单的3个步骤的教程(断开的链接已删除)

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

另外:确保字体在您的副本捆绑资源中。


14

15
本教程非常好。shang-liang.com/blog/custom-fonts-in-ios4重要的是,[UIFont fontWithName:...]的NSString参数是字体的OS名称,而不是文件名。
Willster,

152
在其他人花费3个小时安装fontforge之前,您需要找到iOS所需字体的实际脚本名称。我要指出的是,您只需在字体书中的字体上按Cmd + I即可找到此信息。
丹尼尔·伍德

42
在努力获得正确的字体名称后,我只列出了已安装的字体并找到了它。非常有帮助。这是代码:for([UIFont familyNames]中的NSString * familyName){NSLog(@“ Family%@”,familyName); NSLog(@“名称=%@”,[UIFont fontNamesForFamilyName:familyName]); }
史蒂夫·波特

26
如果您的代码不起作用,请确保您发现字体文件出现在“ Build Phases”->“ Copy Bundle Resouces”中
Mickey

299

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

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

重要文件是 FontLabel.hFontLabel.m

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

浏览源 此处。

要么

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

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

  • 将此键设为数组

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

  • Info.plist

  • 现在,在您的应用程序中,您只需调用[UIFont fontWithName:@"CustomFontName" size:15]即可获取与UILabelsUITextViews等配合使用的自定义字体。

欲获得更多信息


2
我尝试使用您的代码,但是根据字体的不同,它经常崩溃。例如,尝试从此处fontspace.com/category/tiki使用非洲或Tiki字体。
09年

2
这个图书馆很棒。我需要垂直间距的帮助。无法弄清楚该怎么做。所以我有这个消息。numberOfLines = 3; 如何控制第1行,第2行和第3行之间的垂直间距?Tee,谢谢您
teepusink

2
@commanda您好commanda,您在答案中提供的链接似乎不可用。
Parth Bhatt

5
@ParthBhatt您应该使用stackoverflow.com/a/2616101/21447中提供的解决方案,而不要使用FontLabel,因为此功能现在由CocoaTouch提供。
Commanda

2
@ParthBhatt:我不知道为什么回购不再由zynga托管,但可以在github.com/kballard/fontlabel上找到
Lily Ballard

116

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

  1. 将字体文件(例如Chalkduster.ttf)添加到参考资料 XCode中项目的文件夹中。
  2. 打开info.plist并添加一个名为UIAppFonts。此项的类型应为array。
  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
似乎可以支持3.2,而不仅仅是4.0+
Jesse Rusak 2010年

1
谢谢!我一直遇到的问题是,自定义字体与内置字体相比似乎偏高一点(下面有多余的空格)。我尝试使用来自GitHub的FontLabel存储库,这在某些时间(但并非所有时间)都可以提供帮助。
Joe D'Andrea

12
值得注意的是,传递给UIFont构造函数的字符串不是文件名减去扩展名及其字体的内部名称。我在加载使用缩短的文件名的字体时遇到问题。当我使用文件中包含的整个字体名称时,字体加载正常。
slayton

5
莱顿刚才说的很关键。[UIFont fontWithName:期望字体的“全名”,这可以通过在“字体书”中打开并选择:预览->显示字体信息
electromaggot

51

在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]];

36

编辑:此答案自iOS3.2起已失效;使用UIAppFonts

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

以下将加载.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]];

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

#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;
}

请注意那些想知道的方法,它确实可以工作,但是您需要在使用字体之前立即调用loadFonts -它们似乎并不会在整个应用程序中保持加载状态
像素

在OS 3.0中,您肯定需要使用第二个第二个示例,请不要忘记导入。对我来说很好。
M. Ryan

另一个注意事项-这是一个私有框架,并且会动态加载它...两者都可能会阻止您的应用程序进入AppStore。
像素

结论是什么?有什么替代方法?
Raj Pawan Gumdal '04

1
还应注意,[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];对于我尝试过的任何自定义字体,返回的宽度和高度均为0。
路加·麦克尼斯

34

使用iOS 8+和Xcode 6+,您可以轻松实现此目的。步骤如下:

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

在此处输入图片说明

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

在此处输入图片说明

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

这是本文中的代码的快速摘要,可帮助您找到字体名称。

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


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

   }

}

编辑

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

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


1
请注意。即使在IB中正确配置,自定义字体在LaunchScreens中也不可用。这可能是逻辑。
Rivera

@Rivera哇,请注意!不知道 我认为可能的替代方法是将UIImage与文本一起使用。
Dima Deplov

@Rivera,感谢您提供的信息-是否在任何地方都有记录?我反复地检查台阶,以为错过了一步。
spongessuck16年

@spongessuck不知道你的问题,但有一些文档developer.apple.com/library/ios/documentation/StringsTextFonts/...
迪马Deplov

27

我这样做是这样的:

加载字体:

- (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
我确定它能很好地工作,但是(真的)我不想编写自己的布局引擎来处理UILabel和UITextView当前为我所做的所有事情-特别是自动换行,定位和编辑。
Airsource Ltd

1
AFAICS,这仅适用于大写字符,因此调用“ uppercaseString”。
马丁·科特

2
我很不高兴,因为“魔术数字”把戏是一个纯粹的技巧,实际上是行不通的。真正的解决方案是从TTF文件中获取cmap表。
马丁·科特2009年

1
这是直接在Core Graphics中使用字体的完整信息。只是为了将来的读者更新:在较新的操作系统中,可以并且应该使用Core Text。或者,可以使用CGContextShowTextAtPoint()-尽管它不适用于UTF-8。
伊万·武恰卡(IvanVučica)2012年

20

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

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

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

3)确保您具有使用该字体的合法权利。通过将其包含在您的应用中,您还可以进行分发,并且您需要有权这样做。


您实际上已经成功完成了吗?我无法使其正常运行,并且谷歌搜索只会发现尝试过它并失败的其他人。
Airsource Ltd

是。我有。同样,请确保使用正确的字体名称。
8

1
当您说“字体的“名称”不一定是文件名”时...如何找到正确的名称?
基思·菲茨杰拉德

7
是的,这个答案是错误的。您不能开箱即用。
乔纳森·斯特林

iOS 9更新,UIFont文档未提及自定义字体
Cbas

20

如果您正在使用xcode 4.3,则必须根据自定义字体Xcode 4.3中的https://stackoverflow.com/users/1292829/arne将其添加fontBuild Phase下面。这对我有用,这是我为使自定义字体在我的应用中工作而采取的步骤:Copy Bundle Resources

  1. 将字体添加到您的项目。我将OTF(或TTF)文件拖放到我创建的新组中,并接受xcode选择copying the files over to the project folder
  2. 创建一个UIAppFonts数组,将字体列为数组中的项。只是names扩展名,而不是扩展名(例如“ GothamBold”,“ GothamBold-Italic”)。
  3. 点击屏幕左侧project name顶部的方式Project Navigator
  4. 单击Build Phases出现在xcode主要区域中的标签。
  5. 展开“ Copy Bundle Resources”部分,然后单击"+"以添加字体。
  6. 在单击时,从打开的文件导航器中选择字体文件"+"
  7. 对您必须使用的每种字体执行此操作add to the project

12

这是逐步说明如何进行。无需额外的库或任何特殊的编码。

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

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


12

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

您只需要在资源文件夹中添加例如font.ttf这样的字体。

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

当设置字体时 setFont:"corresponding Font Name"

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

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


11

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

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

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

将字体文件拖到您的项目中,然后单击以将它们添加到目标中

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

如果忘记了如何向应用目标添加字体

为了确保您的字体是应用程序目标的一部分,请确保它们在构建阶段显示在您的副本捆绑资源

如何检查资源以查看字体是否是应用程序目标的一部分

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

转到“ 信息”部分中的“ 自定义iOS目标属性”,然后向该部分中的项添加一个密钥(您在键入时会看到它是一个选项,它将自身设置为数组。单击小箭头。打开数组项并键入您添加的.ttf或.otf文件的名称,以使您的应用程序知道这些是您想要的字体文件Fonts provided by application

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

添加自定义字体的示例plist

第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);
    }
}

您的日志应如下所示:

搜索日志以查找字体名称的示例

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

迅速

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

目标C

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];

10

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



8

一个重要的注意事项:您应该使用与字体关联的“ PostScript名称”,而不是其全名或家族名称。该名称通常可以与字体的常规名称不同。


7

按照此步骤

1)将字体复制到项目中

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

3)在此之前-右键单击您的字体,然后在fontforge或类似的编辑器中将其打开, install然后在系统中将其,install

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
为什么不打开info.plist
猛禽

为什么在第4点的Plist中没有,而在第5点的Myraid和Pro之间没有空间?
jayant rawat

@jayantrawat安装字体后在系统中显示其字体名称,.plist是字体文件的名称[.ttl或otf]
KirtikumarA。

@KirtikumarA。是得到了在应用程序成功it..implemented ..
贾扬特·拉瓦特

@jayantrawat(如果我的解决方案有帮助),然后要求您放弃答案,以便其他用户以同样的方式获得帮助
Kirtikumar A.

6

也许作者忘记为字体赋予Mac FOND名称

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

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

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


6

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

[UIFont fontWithName:size:]即使使用FontForge设置FOND名称,仅与Resources目录中的字体一起使用也不起作用。

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


5

抬头 ATSApplicationFontsPath

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


您在设备上尝试过吗?我没有高兴,并且谷歌搜索表明该plist条目在iPhone上不受支持,即使它已记录在iPhone OS中。
Airsource Ltd

1
抱歉,目前我仅在OS X应用中使用它。
马特·塞弗顿

5

我已将本页上的一些建议合并为适用于iOS 5的内容。

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

完成此操作后,它将起作用:

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

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

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


5

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

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

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

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

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


5

对于iOS 3.2及更高版本:使用上述几种提供的方法:

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

但是 “真实字体名称”并不总是在Fontbook中看到的。最好的方法是询问设备看到的字体以及确切的名称。

我使用uifont-name-grabber发布的 uifont-name-grabber

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


5

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

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


3

从iOS 4.1开始,有一种使用自定义字体的新方法。它允许您动态加载字体,无论字体来自应用程序随附的文件,下载的数据还是您拥有的文件。它还可以让您根据需要加载字体,而旧方法则是在应用启动时全部加载字体,如果您拥有多种字体,则可能会花费很长时间。

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

您可以使用该CTFontManagerRegisterGraphicsFont函数,并为其提供字体数据缓冲区。UIFont就像旧方法一样,它可用于Web视图。这是该链接的示例代码:

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);

我已使用此代码,但出现&error无法加载字体:操作无法完成。(com.apple.coretext错误105-无法注册CGFont'<CGFont(0x14fe7df0):Shruti>')
Hiren

根据文档,错误105为kCTFontManagerErrorAlreadyRegistered“文件已在指定范围内注册”。developer.apple.com/library/ios/#documentation/Carbon/Reference/...
大卫·

3

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)

只是想知道,为什么您不只是将字体添加到Info.plist中,对于同一件事,似乎还要做很多工作。
斯蒂芬·杰西

2

您可以在资源文件夹中添加所需的“ FONT”文件。然后转到Project Info.plist文件,并使用键“应用程序提供的字体”,并将其值设置为“字体名称”。

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


1

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

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

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


1

尽管上面的某些答案是正确的,但我为仍然遇到字体问题的人编写了详细的视觉教程。

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

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

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

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


我刚试过 似乎可以使用,但是无论我设置什么大小,我的字体都很小。对于它的价值,我使用的是免费提供的OTF文件:philsfonts.com/index.php/free_fonts
ari gold

请尝试使用任何其他自定义字体,如果问题仍然存在,请告诉我。如果这样有效,则说明您的字体有问题。
巴拉特·古拉提

1

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

一步一步跟随那里:

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

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

将此键设为数组

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

保存Info.plist现在,在您的应用程序中,您可以简单地调用[UIFont fontWithName:@“您的自定义字体名称” size:20]以获取自定义字体,然后将其应用于UILabels(如果您使用的字体不正确),然后双击在自定义字体上,并仔细查看顶部字体名称即将到来并将其复制并粘贴,在此处[UIFont fontWithName:@“在此处超过您的自定义字体名称”,大小:20]

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


1

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

一步一步跟随那里:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.