【问题标题】:Can I embed a custom font in an iPhone application?我可以在 iPhone 应用程序中嵌入自定义字体吗?
【发布时间】:2010-09-26 12:30:38
【问题描述】:

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

【问题讨论】:

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

标签: ios cocoa-touch fonts


【解决方案1】:

iOS 3.2 及更高版本支持此功能。直接来自 What's New in iPhone OS 3.2 文档:

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

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

Apple 开发者论坛上有一个正在进行的主题:
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 等...

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

【讨论】:

  • 这个教程很好。 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”中
【解决方案2】:

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

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

重要的文件是FontLabel.hFontLabel.m

它使用了来自Genericrich's answer的一些代码。

浏览源Here.

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

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

  • 将此键设为数组

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

  • 保存Info.plist

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

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 获得
【解决方案3】:

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

  1. 将您的字体文件(例如,Chalkduster.ttf)添加到 XCode 中项目的 Resources 文件夹中。
  2. 打开info.plist 并添加一个名为UIAppFonts 的新密钥。此键的类型应为数组。
  3. 将您的自定义字体名称添加到此数组中,包括扩展名 (Chalkduster.ttf)。
  4. 现在您可以在应用程序中使用[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 构造函数的字符串是 NOT 文件名减去其字体内部名称的扩展名。我在加载文件名已缩短的字体时遇到问题。当我使用文件中包含的整个字体名称时,字体加载正常。
  • slayton 刚才说的很关键。 [UIFont fontWithName: 需要字体的“全名”,通过在字体册中打开它并选择:预览 - > 显示字体信息
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

    我能够成功加载自定义 UIFonts 的唯一方法是通过私有 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 宽度和高度。
    【解决方案6】:

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

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

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

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

    这是本文代码的 swift sn-p 代码,可帮助您找到字体名称。

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

    编辑

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

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

    【讨论】:

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

    我是这样做的:

    加载字体:

    - (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,这仅适用于大写字符,因此调用 'uppercaseString'。
    • 我投了反对票,因为“幻数”技巧是一种纯粹的 hack,并没有真正起作用。真正的解决方案是从TTF文件中获取cmap表。
    • 这是一篇关于在 Core Graphics 中直接使用字体的简洁信息。只是为未来的读者更新:在较新的操作系统中,可以而且应该使用 Core Text。或者,可以使用CGContextShowTextAtPoint()——尽管它不适用于 UTF-8。
    【解决方案8】:

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

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

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

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

    【讨论】:

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

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

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

    【讨论】:

      【解决方案10】:

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

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

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

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

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

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

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

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

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

      【讨论】:

        【解决方案11】:

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

        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];查看您的字体是否被添加。

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

          【讨论】:

            【解决方案13】:

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

            【讨论】:

              【解决方案14】:

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

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

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

              【讨论】:

                【解决方案15】:

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

                【讨论】:

                  【解决方案16】:

                  按照这个步骤进行

                  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开始更改

                  完成!! 如果您的字体仍然无法使用,请先检查您的字体兼容性

                  【讨论】:

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

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

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

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

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

                  【讨论】:

                    【解决方案18】:

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

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

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

                    【讨论】:

                      【解决方案19】:

                      查找ATSApplicationFontsPath

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

                      【讨论】:

                      • 你在设备上试过了吗?我不高兴,谷歌搜索表明这个 plist 条目在 iPhone 上不受支持,即使它是为 iPhone OS 记录的。
                      • 抱歉,我目前只在 OS X 应用程序中使用它。
                      【解决方案20】:

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

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

                      【讨论】:

                        【解决方案21】:

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

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

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

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

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

                        【讨论】:

                          【解决方案22】:

                          对于 iOS 3.2 及更高版本: 使用上面几个提供的方法,分别是:

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

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

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

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

                          【讨论】:

                            【解决方案23】:

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

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

                            【讨论】:

                              【解决方案24】:

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

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

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

                              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/…
                              【解决方案25】:

                              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 中添加字体,这似乎需要更多的工作来完成基本相同的事情。
                              【解决方案26】:

                              您可以在资源文件夹中添加所需的“字体”文件。然后进入项目Info.plist文件,使用KEY“应用程序提供的字体”,值为“FONT NAME”。

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

                              【讨论】:

                                【解决方案27】:

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

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

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

                                【讨论】:

                                  【解决方案28】:

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

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

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

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

                                  Using custom fonts in ios application

                                  【讨论】:

                                  • 我刚试过这个。似乎可以工作,但我的字体很小,无论我设置什么大小。对于它的价值,我正在使用一个免费提供的 OTF 文件:philsfonts.com/index.php/free_fonts
                                  • 尝试使用任何其他自定义字体,如果问题仍然存在,请告诉我。如果它是这样工作的,那么你的字体就有问题。
                                  【解决方案29】:

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

                                  一步一步跟着那里:

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

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

                                  将此键设为数组

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

                                  保存 Info.plist 现在在您的应用程序中,您可以简单地调用 [UIFont fontWithName:@"your Custom font Name" size:20] 来获取用于您的 UILabel 的自定义字体 如果您没有获得正确的字体,则应用此功能后,请双击自定义字体,并仔细查看顶部字体名称正在出现并复制此字体,粘贴到此处 [UIFont fontWithName:@" here past your Custom font Name" 大小: 20]

                                  希望你能得到正确答案

                                  【讨论】:

                                    【解决方案30】:

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

                                    一步一步跟着那里:

                                    • 将自定义字体文件添加到项目的支持文件中
                                    • 在名为 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] 我希望你能得到正确的答案

                                    【讨论】:

                                      猜你喜欢
                                      • 2011-03-26
                                      • 2011-03-01
                                      • 2010-12-28
                                      • 1970-01-01
                                      • 2012-05-31
                                      • 2011-03-31
                                      • 1970-01-01
                                      • 1970-01-01
                                      • 2015-06-27
                                      相关资源
                                      最近更新 更多