ChatGPT解决这个技术问题 Extra ChatGPT

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

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

在斯坦福大学的 CS193p(iPhone 应用程序开发)讲座中,Evan 指出在设备上安装自己的字体是“大量工作”,这至少意味着它是可能的 :-)
iPhone 3.2 允许自定义字体,但仅限 iPad(请参阅下面的答案)
我最后使用了图像。
哇...毕竟,答案仍然是图像...令人难以置信。我真的希望能够可靠地实现与系统字体具有相同功能的自定义字体。唉...
我已经大幅削减了最初的问题,以反映自我提出这个问题以来已经过去了十年。我鼓励其他人适当地修改他们的评论和答案。

J
Juan Carlos Méndez

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

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

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

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

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

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

另外:确保字体在您的 Copy Bundle Resources 中。


这是 iOS4 的分步教程:blog.beefyapps.com/2010/06/custom-fonts-in-ios-4
这个教程非常好。 shang-liang.com/blog/custom-fonts-in-ios4 重要的是,[UIFont fontWithName:...] 的 NSString 参数是字体的 OS 名称,而不是文件名。
在其他人花费 3 个小时安装 fontforge 以找到 iOS 所需字体的实际 postscript 名称之前。我会指出,您只需在字体册中的字体上按 Cmd+I 即可找到此信息。
在努力获得正确的字体名称之后,我只是列出了已安装的字体并找到了它。非常有帮助。这是代码: for ( NSString *familyName in [UIFont familyNames] ) { NSLog(@"Family %@", familyName); NSLog(@"Names = %@", [UIFont fontNamesForFamilyName:familyName]); }
如果您的代码不起作用,请确保您发现字体文件出现在“Build Phases”->“Copy Bundle Resouces”中
R
Rishil Patel

编辑:从 iOS 3.2 开始,这个功能是内置的。如果你需要支持 pre-3.2,你仍然可以使用这个解决方案。

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

重要的文件是 FontLabel.hFontLabel.m

它使用 Genericrich's answer 中的一些代码。

浏览源 Here.

或者

将字体文件复制到资源中

向名为 UIAppFonts 的 Info.plist 文件添加一个键。 (“应用程序提供的字体)

将此键设为数组

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

保存信息.plist

现在在您的应用程序中,您可以简单地调用 [UIFont fontWithName:@"CustomFontName" size:15] 来获取自定义字体以用于您的 UILabel 和 UITextViews 等...

For More Information


我试过使用你的代码,但它经常崩溃,具体取决于字体。例如,尝试使用此处 fontspace.com/category/tiki 中的非洲或 Tiki 字体。
这个库很好用。不过,我需要垂直间距方面的帮助。无法弄清楚该怎么做。所以我有这个 message.numberOfLines = 3;如何控制第 1 行、第 2 行和第 3 行之间的垂直间距?谢谢你,三通
@commanda 您好,commanda,您在答案中提供的链接似乎不可用。
@ParthBhatt 您应该使用 stackoverflow.com/a/2616101/21447 中提供的解决方案而不是 FontLabel,因为此功能现在由 CocoaTouch 提供。
@ParthBhatt:我不知道为什么 repo 不再托管在 zynga,但它可以在 github.com/kballard/fontlabel
C
Community

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

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

不幸的是,IB 不允许使用自定义字体初始化标签。请参阅 this question 来解决此问题。我最喜欢的解决方案是使用自定义 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.2,而不仅仅是 4.0+
谢谢!我一直遇到的问题是自定义字体与内置字体相比似乎有点偏高(下面有额外的空间)。我尝试使用 GitHub 的 FontLabel 存储库,它有时会有所帮助,但并非总是如此。
值得注意的是,您传递给 UIFont 构造函数的字符串不是文件名减去其字体内部名称的扩展名。我在加载文件名已缩短的字体时遇到问题。当我使用文件中包含的整个字体名称时,字体加载正常。
slayton 刚才说的很关键。 [UIFont fontWithName: 需要字体的“全名”,通过在字体册中打开它并选择:预览->显示字体信息可见
b
bdev

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

r
rpetrich

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

我能够成功加载自定义 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]];

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

请注意那些想知道的人,这确实有效,但是您需要在使用字体之前立即调用 loadFonts ——它们似乎不会在整个应用程序中保持加载
在 OS 3.0 中,您肯定需要使用第二个示例,不要忘记导入。对我来说工作得很好。
另一个注意事项 - 这是一个私有框架,并且会动态加载它......这两者都可能会阻止您的应用程序被 AppStore 接受。
结论是什么?这种方法有什么替代方法?
还应注意,对于我尝试过的任何自定义字体,[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]]; 都会返回 0 宽度和高度。
R
Rishil Patel

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

1) 将您的字体拖放到 Xcode Supporting Files 文件夹。不要忘记在添加到目标部分标记您的应用。从此时起,您可以在 IB 中使用该字体并从字体托盘中选择它。

https://i.stack.imgur.com/Ovbpb.png

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

https://i.stack.imgur.com/ak315.png

如果没有,this article 总是帮助我。

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

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


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

   }

}

编辑

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

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


只是一个注释。即使在 IB 中正确配置,自定义字体在 LaunchScreens 中也不可用。这可能是逻辑。
@Rivera 哇,太好了!不知道那个。我认为可能的替代方法是使用带有文本的 UIImage 。
@Rivera,感谢您提供的信息-它在任何地方都有记录吗?我一遍又一遍地重复步骤,以为我错过了一步。
@spongesuck 不确定您的问题,但有一些文档developer.apple.com/library/ios/documentation/StringsTextFonts/…
S
Sophie Alpert

我已经这样做了:

加载字体:

- (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),但它可以工作。

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


我确信它运行良好,但我(真的)不想编写自己的布局引擎来处理 UILabel 和 UITextView 目前为我所做的一切——尤其是自动换行、定位和编辑。
AFAICS,这仅适用于大写字符,因此是“大写字符串”调用。
我投了反对票,因为“幻数”技巧是一种纯粹的 hack,它并没有真正起作用。真正的解决方案是从 TTF 文件中获取 cmap 表。
这是一篇关于直接在 Core Graphics 中使用字体的简洁信息。只是为未来的读者更新:在较新的操作系统中,可以而且应该使用 Core Text。或者,可以使用 CGContextShowTextAtPoint()——尽管它不适用于 UTF-8。
A
August

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

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

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

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


你真的成功了吗?我无法让它工作,谷歌搜索只会找到其他尝试过但失败的人。
是的。我有。再次,确保您使用正确的字体名称。
当您说“字体的“名称”不一定是文件名”时......如何找到正确的名称?
是的,这个答案是错误的。你不能开箱即用。
iOS 9 更新,UIFont 文档未提及自定义字体
C
Community

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

将字体添加到您的项目中。我将 OTF(或 TTF)文件拖放到我创建的新组中,并接受了 xcode 将文件复制到项目文件夹的选择。创建 UIAppFonts 数组,将您的字体列为数组中的项目。只是名称,而不是扩展名(例如“GothamBold”、“GothamBold-Italic”)。点击屏幕左侧 Project Navigator 顶部的项目名称方式。单击出现在 xcode 主要区域中的 Build Phases 选项卡。展开“复制捆绑资源”部分并单击“+”以添加字体。当您单击“+”时,从弹出的文件导航器中选择字体文件。对您必须添加到项目中的每种字体执行此操作。


C
Chris Klingler

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

第 1 步 - 将 .ttf 或 .otf 从 Finder 拖到您的项目中

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

https://i.stack.imgur.com/U611W.png

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

https://i.stack.imgur.com/PhI5I.png

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

https://i.stack.imgur.com/awWkY.png

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

转到 Info 部分中的 Custom iOS Target Properties 并为该部分中名为 Fonts provided by application 的项目添加一个键(您应该会看到它作为一个选项出现你输入它,它就会将自己设置为一个数组。单击小箭头打开数组项并输入你添加的 .ttf 或 .otf 文件的名称,让你的应用程序知道这些是字体文件你想要可用

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

https://i.stack.imgur.com/kiVl8.png

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

您的日志应如下所示:

https://i.stack.imgur.com/bR2xl.png

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

迅速

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

目标 C

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

5
5566

这是一步一步的说明如何做到这一点。不需要额外的库或任何特殊编码。

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

大多数时候问题出在字体而不是方法上。最好的方法是使用肯定会起作用的字体,比如 verdana 或 geogia。然后更改为预期的字体。如果它不起作用,可能是字体名称不对,或者字体不是格式正确的字体。


H
Hemang

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

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

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

设置字体时,请执行 setFont:"corresponding Font Name"

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

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


N
Nano

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


J
John

还没有出来,但是下一个版本的 cocos2d(2d 游戏框架)会支持变长位图字体作为字符映射。

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

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


u
user576862

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


R
Rishil Patel

按照这个步骤

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

自您的 UILabel 起,这里的 lblPoints 将发生变化

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


为什么不打开 info.plist
当第 4 点的 Plist 中没有空格时,为什么在第 5 点 Myraid 和 Pro 之间有空格?
@jayantrawat 安装字体后系统显示的字体名称,.plist 是字体文件的名称[ .ttl 或 otf ]
@jayantrawat 如果我的解决方案有帮助,那么请您放弃对答案的投票,以便其他用户可以以同样的方式获得帮助
@KirtikumarA。我已经使用教程做到了..我的字体名称只有一个拼写错误..我只是好奇为什么你在字体名称的第 5 点有一个空格,而在 plist 的第 4 点没有空格..无论如何仍然赞成你的回答,现在这几天很少见了。
B
ByteNirvana

也许作者忘记给字体一个Mac FOND name

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

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

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


H
Hemang

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

即使使用 FontForge 设置了 FOND 名称,简单地使用 [UIFont fontWithName:size:] 和 Resources 目录中的字体也是行不通的。

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


M
Matt Sephton

查找ATSApplicationFontsPath

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


你在设备上试过吗?我没有高兴,谷歌搜索表明这个 plist 条目在 iPhone 上不受支持,即使它是为 iPhone OS 记录的。
抱歉,我目前只在 OS X 应用程序中使用它。
A
AaronBaker

我已将此页面上的一些建议合并到适用于 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 即可。

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


A
Alejandro Luengo

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

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

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

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

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


N
NANNAV

iOS 3.2及以上:使用上面几个提供的方法,分别是:

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

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

我使用 uifont-name-grabber 发布于:uifont-name-grabber

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


H
Hemang

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

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


N
NANNAV

从 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 Failed to load font: The operation could not be completed。 (com.apple.coretext 错误 105 - 无法注册 CGFont '')
根据文档,错误 105 是 kCTFontManagerErrorAlreadyRegistered,“文件已在指定范围内注册”。 developer.apple.com/library/ios/#documentation/Carbon/Reference/…
D
Daniel Krom

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 中添加字体,对于本质上相同的事情来说似乎需要做更多的工作。
H
Hemang

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

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


E
ElizaS

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

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

这样做之后,您的字体将出现,一切都会正常工作。


c
collapsar

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

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

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

是正确的。请现在使用任何其他骇人听闻的方式。如果您仍然面临查找字体名称和添加它们的问题,这里是教程 -

Using custom fonts in ios application


我刚试过这个。似乎可以工作,但我的字体很小,无论我设置什么大小。值得一提的是,我使用的是免费提供的 OTF 文件:philsfonts.com/index.php/free_fonts
尝试使用任何其他自定义字体,如果问题仍然存在,请告诉我。如果它以这种方式工作,那么您的字体就有问题。
A
Akhil Bhadauria

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

一步一步跟随那里:

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

向名为 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]

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


R
Rishil Patel

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

一步一步跟随那里:

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

向名为 UIAppFonts 的 Info.plist 文件添加一个键。

将此键设为数组

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

保存 Info.plist 现在在您的应用程序中,您可以简单地调用 [UIFont fontWithName:@"your Custom font Name" size:20] 来获取与您的 UILabel 一起使用的自定义字体

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