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

Air*_*Ltd 771 fonts cocoa-touch ios

这个问题涉及iOS 3.2之前的版本.从3.2开始,使用下面的samvermette答案很容易实现这个功能,我已经改变了接受的答案(从命令到samvermette)以反映这一点.我不能赞同这两个答案(除了upvotes),但它们都很好.

我想有一个应用程序包括一个自定义字体用于渲染文本,加载它,然后使用标准UIKit元素,如UILabel.这可能吗?

我在下面找到了链接:

但是这些要求我自己渲染每个字形,这有点太辛苦了,特别是对于多行文本.

我也发现帖子直截了当地表示这是不可能的,但没有理由,所以我正在寻找一个确定的答案.


编辑 - UIKit实验失败

我下载了Harrowprint.tff(从这里下载)并将其添加到我的Resources目录和项目中.然后我尝试了这段代码:

__PRE__

导致抛出异常.查看Finder中的TTF文件,确认字体名称为Harrowprint.


编辑 - 到目前为止已经有很多回复告诉我阅读关于X或Y的文档.我已经对所有这些进行了广泛的实验并且无处可去.在一个案例中,X结果仅与OS X相关,而不是在iPhone上.因此,我正在为这个问题设置一个赏金,我将奖励给第一个提供答案的人(仅使用文档化的API),他们会回答足够的信息以便在设备上运行.在模拟器上工作也是一个奖励.


编辑 - 似乎赏金自动奖励得票最多的答案.有趣.实际上没有人提供解决问题的答案 - 涉及编码自己的UILabel子类的解决方案不支持自动换行,这对我来说是一个必不可少的功能 - 尽管我想我可以扩展它来做到这一点.

sam*_*tte 644

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

自定义字体支持
想要使用自定义字体的应用程序现在可以在其应用程序包中包含这些字体,并通过在其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中.

  • 之前其他人花了3个小时安装fontforge,以便找到iOS所需字体的实际postscript名称.我会指出你可以在字体书中的字体上按Cmd + I来查找这些信息. (152认同)
  • 在努力获得正确的字体名称之后,我刚刚列出了已安装的字体并找到了它.很有帮助.这是代码:for([UIFont familyNames]中的NSString*familyName){NSLog(@"Family%@",familyName); NSLog(@"Names =%@",[UIFont fontNamesForFamilyName:familyName]); } (42认同)
  • 如果您的代码不起作用,请确保您在"构建阶段" - >"复制捆绑包资源"中找到字体文件 (25认同)
  • 本教程非常好.http://shang-liang.com/blog/custom-fonts-in-ios4/重要的是,[UIFont fontWithName:...]的NSString参数是字体的*OS*名称而不是文件名. (15认同)
  • 这是iOS4的分步教程:http://blog.beefyapps.com/2010/06/custom-fonts-in-ios-4/ (14认同)
  • 在上面的过程中使用的`CustomFontName`是OS X上Font Book中字体信息中的`PostScript name`字段. (3认同)

com*_*nda 299

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

我创建了一个扩展UILabel和处理加载.ttf文件的简单模块.我在Apache许可下发布了opensource并将它放在github Here上.

重要文件是FontLabel.hFontLabel.m.

它使用了Genericrich的一些代码.

这里浏览来源.

要么

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

  • Info.plist文件中添加一个名为UIAppFonts的密钥.("申请提供的字体)

  • 将此键设为数组

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

  • 保存 Info.plist

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

欲获得更多信息

  • @ParthBhatt您应该使用http://stackoverflow.com/a/2616101/21447中提供的解决方案而不是FontLabel,因为此功能现在由CocoaTouch提供. (5认同)
  • 我尝试过使用你的代码,但根据字体的不同,它会经常崩溃.例如,尝试使用http://www.fontspace.com/category/tiki上的非洲或Tiki字体. (2认同)
  • 这个库很棒.我需要帮助垂直间距.无法弄清楚该怎么做.所以我有这个消息.numberOfLines = 3; 如何控制第1行与第2行和第3行之间的垂直间距?谢谢,Tee (2认同)
  • @commanda Hello commanda,你在答案中提供的链接似乎不可用. (2认同)
  • @ParthBhatt:我不知道为什么repo不再托管在zynga,但它可以在https://github.com/kballard/fontlabel上找到 (2认同)

ale*_*xey 116

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

  1. 将您的字体文件(例如Chalkduster.ttf)添加到XCode中项目的Resources文件夹中.
  2. 打开info.plist并添加一个名为的新密钥UIAppFonts.此键的类型应为数组.
  3. 将自定义字体名称添加到此数组,包括extension(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
Run Code Online (Sandbox Code Playgroud)

  • 值得注意的是,传递给UIFont构造函数的字符串是_NOT_文件名减去扩展名的字体内部名称.我在加载带有缩短文件名的字体时遇到问题.当我使用整个字体名称包含在文件中时,字体加载正常. (12认同)
  • 斯莱顿刚才说的很重要.[UIFont fontWithName:期望字体的"全名",通过在字体簿中打开并选择:预览 - >显示字体信息可见 (5认同)
  • 这似乎得到了支持,而不仅仅是4.0+ (3认同)

bde*_*dev 51

在Info.plist中添加条目"由应用程序提供的字体"并将字体名称包括为字符串:

Fonts provided by application
           Item 0        myfontname.ttf
           Item 1        myfontname-bold.ttf
           ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

[label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]];
Run Code Online (Sandbox Code Playgroud)

  • 帮助我获得具有不同参数的字体的实际名称.... (4认同)

rpe*_*ich 36

编辑:从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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

甚至可以在运行时加载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;
}
Run Code Online (Sandbox Code Playgroud)


Dim*_*lov 34

使用iOS 8+和Xcode 6+,您可以轻松完成此操作.以下是步骤:

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

在此输入图像描述

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

在此输入图像描述

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

以下是本文代码的快速摘录,以帮助您找到您的字体名称.

func allFonts(){

   for family in UIFont.familyNames(){

       println(family)


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

   }

}
Run Code Online (Sandbox Code Playgroud)

编辑

我想提一下,您需要将字体文件添加到Target的Build Phases,Copy Bundle Resources.没有它,您将无法在设备上看到您的字体.它可能会导致意外行为.

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


Gen*_*ich 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); 
}
Run Code Online (Sandbox Code Playgroud)

现在,在你的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]);
}
Run Code Online (Sandbox Code Playgroud)

基本上你必须在文本中做一些暴力循环并用魔术数字来寻找你的偏移量(在这里,请看我用29),但是它有效.

此外,您必须确保该字体是合法嵌入的.大多数都不是,并且有律师专门研究这类事情,所以要警告.

  • 我正在贬低,因为"神奇数字"技巧是一个真正无效的纯黑客.真正的解决方案是从TTF文件中获取cmap表. (2认同)

Aug*_*ust 20

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

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

2)字体的"名称"不一定是文件名.

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

  • 是的,这个答案是错误的.你无法开箱即用. (7认同)

小智 20

如果你正在使用xcode 4.3,您必须添加fontBuild PhaseCopy Bundle Resources,根据/sf/users/90498061/在线程,自定义字体的Xcode 4.3.这对我有用,这里是我在我的应用程序中使用自定义字体的步骤:

  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 Phasesxcode主区域中显示的选项卡.
  5. 展开" Copy Bundle Resources"部分,然后单击"+"以添加字体.
  6. 从单击文件导航器时弹出打开的文件导航器中选择字体文件"+".
  7. 为您需要的每种字体执行此操作add to the project.


556*_*566 12

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

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

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


Sub*_*rat 12

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

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

打开你的申请info.plist.将新行添加为"由应用程序提供的字体",并将字体名称键入为font.ttf.

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

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

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


Col*_*ris 11

我建议您按照我最喜欢的简短教程之一:http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/从中获取此信息.

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

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

将字体文件拖到项目中,然后单击将其添加到目标中

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

如果忘了,如何将字体添加到应用目标

要确保您的字体是应用程序目标的一部分,请确保它们显示在Build Phases中的Copy Bundle Resources

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

第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)")
  }
}
Run Code Online (Sandbox Code Playgroud)

目标C.

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

您的日志应如下所示:

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

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

迅速

 label.font = UIFont(name: "SourceSansPro-Regular", size: 18)
Run Code Online (Sandbox Code Playgroud)

目标C.

 label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
Run Code Online (Sandbox Code Playgroud)


小智 10

在finder中找到TTF并"获取信息".在"全名:"标题下,它给了我一个我随后使用的名称fontWithName(我只是复制并粘贴了确切的名称,在这种情况下,不需要'.ttf'扩展名).


Joh*_*ohn 8

它尚未推出,但下一版本的cocos2d(2d游戏框架)将支持可变长度位图字体作为字符映射.

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

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


小智 8

一个重要的注意事项:您应该使用与字体关联的"PostScript名称",而不是其全名或系列名称.此名称通常可以与字体的常规名称不同.


Byt*_*ana 6

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

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

您也可以尝试在导出对话框中输入"Apple"选项.

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


Jac*_*röm 6

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

您只需通过[UIFont fontWithName:size:]在资源目录中的字体将无法正常工作,即使酒足饭饱名称使用FontForge设置.

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


Kir*_* A. 6

按照这一步

1)在项目中复制字体

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

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

4)键入此

 <key>UIAppFonts</key>
<array>
    <string>MyriadPro.otf</string>
</array>
Run Code Online (Sandbox Code Playgroud)

5)在您的代码中键入此代码 class .m

 [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]];
Run Code Online (Sandbox Code Playgroud)

这里lblPoints将会改变你的 UILabel

完成!如果您的字体仍无效,请先检查字体兼容性


Mat*_*ton 5

抬头 ATSApplicationFontsPath

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


Ric*_*chX 5

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

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


Jar*_*son 5

对于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:期望的名称通过电子邮件向您发送完整的字体列表.


Aar*_*ker 5

我已将此页面上的一些建议合并到iOS 5上适合我的内容中.

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

完成后,这有效:

UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];
Run Code Online (Sandbox Code Playgroud)

但是,您需要知道字体的Postscript名称.只需按照@Daniel Wood的建议,在你使用FontBook时按下命令即可.

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


Ale*_*ngo 5

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

[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];
Run Code Online (Sandbox Code Playgroud)

要确保在项目中加载字体,请调用

NSLog(@"Available Font Families: %@", [UIFont familyNames]);
Run Code Online (Sandbox Code Playgroud)

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