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

这个问题涉及iOS 3.2之前的版本。 从3.2开始,使用samvermette的答案很容易实现这个function,并且我已经将接受的答案(从commanda改为samvermette)来反映这一点。 我不能赞扬这两个答案(除了upvotes),但他们都很好。

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

我发现这些链接:

  • http://discussions.apple.com/thread.jspa?messageID=8304744
  • http://forums.macrumors.com/showthread.php?t=569311

但是这些都要求我自己渲染每个字形,这有点像辛勤工作,特别是对于多行文本。

我也发现了一些文章,说明这是不可能的,但没有理由,所以我正在寻找一个明确的答案。


编辑 – 失败-[UIFont fontWithName:size:]实验

我下载了Harrowprint.tff(从这里下载),并将其添加到我的资源目录和项目。 然后我试了这个代码:

 UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20]; 

导致抛出exception。 查看Finder中的TTF文件,确认字体名称是Harrowprint。


编辑 – 到目前为止,已经有了很多回复,这些回复告诉我要阅读X或Y的文档。我已经对这些内容进行了广泛的尝试,并没有得到任何答案。 在一个案例中,X原来只与OS X相关,而不是iPhone。 因此,我为这个问题设置了一个奖励,我将赏金给第一个提供答案的人(只使用logging的API),他们用足够的信息来回答这个问题。 在模拟器上工作也将是一个奖金。


编辑 – 看来,赏金自动奖给答案与最高票数。 有趣。 没有人真正提供了一个解决问题的答案 – 问题涉及编写自己的UILabel子类的解决scheme不支持自动换行,这对我来说是一个重要的function – 尽pipe我想我可以扩展它来这样做。

iOS 3.2和更高版本支持这一点。 直接从iPhone OS 3.2 doc 的新function

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

一旦在Info.plist设置了字体,就可以使用自定义字体作为IB中的任何其他字体或以编程方式使用。

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

这里有一个很好的和简单的3步教程如何实现这一点(断开链接删除)

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

另外:确保字体在您的复制束资源。

编辑:从iOS 3.2开始,这个function是内置的。如果你需要支持3.2之前的版本,你仍然可以使用这个解决scheme。

我创build了一个扩展UILabel并处理加载.ttf文件的简单模块。 我在Apache许可证下发布了opensource,并将其放在github上:git://github.com/zynga/FontLabel.git

重要的文件是FontLabel.h和FontLabel.m。

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

在这里浏览源代码: http : //github.com/zynga/FontLabel/tree/master

要么

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

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

  • 使这个键是一个数组

  • 对于每种字体,请将字体文件的全名(包括扩展名)作为项目input到UIAppFontsarrays中

  • 保存Info.plist

  • 现在在你的应用程序中,你可以简单地调用[UIFont fontWithName:@“CustomFontName”size:15]来获得自定义字体,用于你的UILabels和UITextViews等等。

了解更多信息

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

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

不幸的是,IB不允许用自定义字体初始化标签。 看到这个问题来解决这个问题。 我最喜欢的解决scheme是使用自定义的UILabel子类:

 @implementation CustomFontLabel - (id)initWithCoder:(NSCoder *)decoder { if (self = [super initWithCoder: decoder]) { [self setFont: [UIFont fontWithName: @"Chalkduster" size: self.font.pointSize]]; } return self; } @end 

在Info.plist中添加条目“由应用程序提供的字体”,并将字体名称包含为string:

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

编辑:这个答案已经失效,截至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; } 

一旦加载字体,就可以像苹果提供的字体一样使用字体:

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

使用iOS 8+和Xcode 6+,您可以轻松完成此任务。 这里是步骤:

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

在这里输入图像描述

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

在这里输入图像描述

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

这里是这篇文章的代码的快速代码,以帮助您find您的字体名称。

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

编辑

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

例如,当我遇到一个错误,当UITextField具有自定义字体,但是这个字体不在复制包资源中。 当我用这个文本字段继续到视图控制器时,在调用viewDidLoad函数之前大约有4秒钟的延迟。 解决字体麻烦消除了这个延迟。 所以,build议检查两次。 (rdar:// 20028250)顺便说一下,我无法重现错误,但是我确定问题在于字体。

我这样做是这样的:

加载字体:

 - (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)魔术数字,但它的作品。

另外,你必须确保字体在法律上是可embedded的。 大多数不是,有律师专门从事这种事情,所以要警告。

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

  1. 将字体添加到您的项目。 我将OTF (或TTF )文件拖放到我创build的新组中,并接受xcode copying the files over to the project folder
  2. 创buildUIAppFontsarrays,将数组中的项目列为项目。 只是names ,而不是扩展名(例如“ GothamBold ”,“ GothamBold-Italic ”)。
  3. 点击屏幕左侧Project Navigator顶部的project name
  4. 点击xcode主区域中的Build Phases选项卡。
  5. 展开“ Copy Bundle Resources ”部分并点击"+"添加字体。
  6. 从文件导航器中select字体文件,点击"+"popup。
  7. 为每个字体add to the project

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

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

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

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

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

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

大多数情况下,问题是字体而不是方法。 最好的方法就是使用一种确实可行的字体,例如verdana或geogia。 然后更改为预期的字体。 如果它不起作用,也许字体名称是不正确的,或者字体不是一个很好的格式字体。

在现有的iOS应用程序中添加新的字体非常简单。

你只需要添加字体,如font.ttf到你的资源文件夹。

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

而当设置字体做为setFont:"corresponding Font Name"

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

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

在查找器和“获取信息”中findTTF。 在“全名:”这个标题下面给了我一个名字,然后我用fontWithName (我刚刚复制并粘贴了确切的名字,在这种情况下,不需要'.ttf'扩展名)。

我会推荐以下一个我最喜欢的简短教程在这里: http : //codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/从这个信息来。

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

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

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

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

如果您忘记了如何将字体添加到应用程序目标

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

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

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

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

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

示例添加自定义字体的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]; 

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

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

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

作者没有确定这个版本的发布date,但是我确实看到一个post,表明它将在未来一两个月内发布。

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

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

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

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

我已经把这个页面上的一些build议合并到了iOS 5上适合我的东西上。

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

你这样做后,这个工作:

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

但是,您需要知道您的字体的Postscript名称。 只要按照@丹尼尔·伍德的build议和新闻命令我,而你在FontBook。

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

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

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

要确保您的字体已加载到项目上,请调用

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

在.plist上,你必须声明字体。 只需添加一个“应用程序提供的字体”logging,并添加一个项目string名称(DINEngschriftStd.otf)

按照这一步

1)在你的项目中复制你的字体

2)在源代码模式下打开你的.plist文件…(注 – 不要打开info.plist)

3)在此之前 – 右键点击你的字体并在fontforge或类似的编辑器中打开它并将其安装到你的系统中,它应该是intall

4)input这个

  <key>UIAppFonts</key> <array> <string>MyriadPro.otf</string> </array> 

5)在你的课堂上input这个代码

  [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]]; 

这里lblPoints将会随着你的UILable而改变

完成! 如果仍然不能正常工作,请首先检查您的字体兼容性

对于iOS 3.2及以上版本:使用上面几个提供的方法,它们是:

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

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

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

只需将所需字体放入xcode项目中,将文件名添加到plist中,然后在您正在构build的设备上运行它,它将使用UIFont fontWithName:期望的名称向您发送完整的字体列表。

查找ATSApplicationFontsPath

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

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

即使使用FontForge设置了FOND名称,在[Resources]目录中简单地使用[UIFont fontWithName:size:]与字体也将不起作用。

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

更好的解决scheme是添加一个新的属性“ Fonts provided by application ”到您的info.plist文件。

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

从iOS 4.1开始,有一种使用自定义字体的新方法。 它允许您dynamic加载字体,无论是从应用程序中包含的文件,下载的数据,或你有什么。 它还允许您在需要时加载字体,而旧方法在应用程序启动时加载它们,如果您有许多字体,则可能需要很长时间。

新的方法在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); 

I made everything possible but the new fonts dont appear so I found the solution:

When you drag the fot files(otf or ttf) DONT forget to check the checkbox under "Add to targets".

After doing that your font will appear and everything will work fine.

Although some of the answers above are correct, I have written a detailed visual tutorial for people still having problems with fonts.

The solutions above which tell you to add the font to the plist and use

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

are the correct ones. Please do now use any other hackish way. If you are still facing problems with finding font names and adding them, here is the tutorial –

Using custom fonts in ios application

You can add the required "FONT" files within the resources folder. Then go to the Project Info.plist file and use the KEY "Fonts provided by the application" and value as "FONT NAME".

Then you can call the method [UIFont fontwithName:@"FONT NAME" size:12];

yes you can use custom font in your application

step by step following there:

  • Add your custom font files into your project in supporting files
  • Add a key to your Info.plist file called UIAppFonts.
  • Make this key an array
  • For each font you have, enter the full name of your font file (including the extension) as items to the UIAppFonts array
  • Save Info.plist Now in your application you can simply call [UIFont fontWithName:@"your Custom font Name" size:20] to get the custom font to use with your UILabels

after applying this if your not getting correct font then you double click on the custom font , and see carefully top side font name is comming and copy this font , paste, here [UIFont fontWithName:@" here past your Custom font Name" size:20] i hope you will get correct answer

yes you can use custom font in your application

step by step following there:

Add your custom font files into your project in supporting files

Add a key to your Info.plist file called UIAppFonts.

Make this key an array

For each font you have, enter the full name of your font file (including the extension) as items to the UIAppFonts array

Save Info.plist Now in your application you can simply call [UIFont fontWithName:@"your Custom font Name" size:20] to get the custom font to use with your UILabels after applying this if your not getting correct font then you double click on the custom font , and see carefully top side font name is comming and copy this font , paste, here [UIFont fontWithName:@" here past your Custom font Name" size:20]

i hope you will get correct answer

Swift, code way: (works also with swift 2.0)

Add the required fonts to your project (just like adding images, just drag to Xcode), make sure that they are targeted to your project
add this method and load custom fonts (recommended in 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: "") } } 

Use example:

 if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType: "ttf"){ loadFont(fontPath) } 

Use the font:

 UIFont(name: "My-Font", size: 16.5)