我能在iPhone应用中嵌入自定义字体吗?

791

我想制作一个应用程序以包含自定义字体以渲染文本,加载它,然后与标准的UIKit元素(如UILabel)一起使用。这是否可行?


5
在斯坦福大学的CS193p(iPhone应用程序开发)课程中,埃文指出在设备上安装自己的字体是“很费事”的,但至少这意味着这是可能的 :-) - Ilya Birman
2
iPhone 3.2 允许自定义字体,但仅限于 iPad(请参见下面的答案)。 - samvermette
6
最后,我使用了图像。 - Airsource Ltd
2
哇...经过所有这些,答案仍然是图像...难以置信。我真的希望能够实现自定义字体与系统字体具有相同的功能。唉... - d2burke
有用的教程:http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ - Suragch
1
我已经大幅削减了原问题以反映自从我提问以来过去的十年。我鼓励其他人适当地减少他们的评论和答案。 - Airsource Ltd
32个回答

5
对于iOS 3.2及以上版本: 使用提供的几种方法,包括:
1.将字体文件(例如Chalkduster.ttf)添加到XCode项目的资源文件夹中。 2.打开info.plist并添加一个名为UIAppFonts的新键。此键的类型应为数组。 3.将您的自定义字体名称添加到此数组中,包括扩展名(“Chalkduster.ttf”)。 4.在您的应用程序中使用[UIFont fontWithName:“Real Font Name”size:16]。
但是,“Real Font Name”并不总是您在Fontbook中看到的那个。最好的方法是询问您的设备看到了哪些字体以及确切的名称是什么。
我使用的是uifont-name-grabber发布在uifont-name-grabber上的字体名称抓取器。
只需将要使用的字体放入xcode项目中,将文件名添加到其plist中,并在正在构建的设备上运行它,它会使用UIFont fontWithName:所需的名称向您发送完整的字体列表。

5

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

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

为了确保字体在项目中加载,请调用以下代码:

调用以下代码以确保项目中已加载您的字体:

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

在 .plist 文件中,您需要声明字体。只需添加一个“应用程序提供的字体”记录,并添加一个项目 0 字符串,其中包含字体的名称(DINEngschriftStd.otf)。

5

我将这个页面上的一些建议结合起来,在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即可。

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


3

Swift编码之道:(适用于Swift2.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中添加字体,这似乎比实际上做同样的事情更费力。 - Jesse Onolemen

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

我使用了这段代码,但是出现了错误:“无法加载字体:操作无法完成。(com.apple.coretext 错误105 - 无法注册CGFont '<CGFont (0x14fe7df0): Shruti>')”。 - Hiren
根据文档,错误105是“kCTFontManagerErrorAlreadyRegistered”,即“该文件已在指定范围内注册。” http://developer.apple.com/library/ios/#documentation/Carbon/Reference/CoreText_FontManager_Ref/Reference/reference.html - David M.

2
你可以将所需的“FONT”文件添加到资源文件夹中。然后进入项目的 Info.plist 文件,使用 KEY“Fonts provided by the application”,值为“FONT NAME”。
然后你可以调用方法 [UIFont fontwithName:@"FONT NAME" size:12];

文件名,不是字体名称... - user1944491

1
我已经尽力了,但是新字体没有显示出来,所以我找到了解决办法:
当你拖动字体文件(otf或ttf)时,不要忘记在“添加到目标”下面勾选复选框。
这样做后,你的字体将会出现,并且一切都能正常工作。

1

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

按照以下步骤:

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

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

将此键设置为数组。

对于每种字体,将完整的字体文件名称(包括扩展名)作为UIAppFonts数组的项输入。

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

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


1

你可以在应用程序中使用自定义字体

步骤如下:

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

如果应用后未能正确获取字体,则双击自定义字体,仔细查看顶部字体名称,并将其复制,粘贴到此处 [UIFont fontWithName:@"这里粘贴您的自定义字体名称" size:20],希望您能得到正确的答案


1
尽管上面的一些答案是正确的,但我为那些仍然在字体方面遇到问题的人编写了详细的视觉教程。
上面的解决方案告诉你将字体添加到plist中并使用。
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];

这些是正确的字体。请不要使用任何其他hackish方式。如果您仍然在寻找字体名称并添加它们方面遇到问题,这里有一个教程 -

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


我刚试了一下。看起来可以工作,但是无论我设置什么大小,我的字体都很小。值得一提的是,我正在使用一个免费可用的OTF文件:https://philsfonts.com/index.php/free_fonts - ari gold
尝试使用其他自定义字体,如果问题仍然存在,请告诉我。如果以这种方式工作,则您的字体存在问题。 - Bharat Gulati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接