Can I embed a custom font in an iPhone application?
此问题与iOS 3.2之前版本有关。从3.2开始,使用下面的samvermette的答案可以很容易地实现这个功能,我已经将接受的答案(从command改为samvermette)更改为反映这一点。我不能把这两个答案都归功于(除了赞成票),但它们都是好的。
我想让一个应用程序包含一个自定义字体来呈现文本,加载它,然后与标准的
我发现以下链接:
- http://discussions.apple.com/thread.jspa?消息ID=8304744
- http://forums.macrumers.com/showthread.php?t=569311
但这些都需要我自己呈现每个字形,这有点像刻苦的工作,特别是对于多行文本。
我还发现一些帖子直截了当地说这是不可能的,但没有理由,所以我正在寻找一个明确的答案。
编辑-失败的
我下载了harrowprint.tff(从这里下载),并将其添加到我的资源目录和项目中。然后我尝试了这个代码:
1 | UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20]; |
导致引发异常。查看finder中的ttf文件,确认字体名是harrowprint。
编辑-到目前为止,已经有很多回复告诉我要阅读x或y上的文档。我已经对所有这些进行了广泛的实验,但一无所获。在一个案例中,X只与OS X相关,而与iPhone无关。因此,我为这个问题设置了一个赏金,我将把这个赏金授予第一个提供答案(只使用文档化的API)的人,他用足够的信息来响应,以便在设备上工作。在模拟器上工作也是一种奖励。
编辑-看起来赏金自动奖励的答案与最高的票数。有趣。实际上,没有人能提供一个答案来解决这个问题——包括编写自己的
iOS 3.2及更高版本支持此功能。直接从iPhone OS 3.2的新增功能文档:
Custom Font Support
Applications that want to use custom fonts can now include those fonts in their application bundle and register those fonts with the system by including the UIAppFonts key in their Info.plist file. The value of this key is an array of strings identifying the font files in the application’s bundle. When the system sees the key, it loads the specified fonts and makes them available to the application.
在
苹果开发者论坛上有一个持续的主题:https://devforums.apple.com/thread/37824(需要登录)
下面是一个关于如何实现这一点的非常简单的3个步骤教程(删除了断开的链接)
另外:确保字体在您的复制包资源中。
编辑:从iOS 3.2开始,此功能是内置的。如果您需要支持3.2之前的版本,您仍然可以使用此解决方案。
我创建了一个扩展
重要的文件是
它使用了一些来自GenericRich答案的代码。
在此处浏览源。
或
将字体文件复制到资源中
在您的
Info.plist 文件中添加一个名为uiappfonts的密钥。(应用程序提供的字体)使此键成为数组
对于您拥有的每个字体,输入字体文件(包括扩展名)的全名作为uiappfonts数组的项。
保存
Info.plist 。现在,在您的应用程序中,您可以简单地调用
[UIFont fontWithName:@"CustomFontName" size:15] 来获取自定义字体,以便与UILabels 和UITextViews 等一起使用。
更多信息
在iOS4中有一种使用自定义字体的简单方法。
不幸的是,ib不允许用自定义字体初始化标签。请参阅此问题以解决此问题。我最喜欢的解决方案是使用自定义
1 2 3 4 5 6 7 8 9 10 11 12 | @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中,添加"应用程序提供的字体"条目,并将字体名称作为字符串包含:
1 2 3 4 | Fonts provided by application Item 0 myfontname.ttf Item 1 myfontname-bold.ttf ... |
然后检查以确保您的字体包含在运行中:
1 2 3 4 5 | for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { NSLog(@"%@", fontName); } } |
请注意,TTF文件名可能与设置标签字体时使用的名称不同(可以使用上面的代码获取"fontWithName"参数):
1 | [label setFont:[UIFont fontWithName:@"MyFontName-Regular" size:18]]; |
编辑:此答案从IOS3.2起失效;使用uiappfonts
我成功加载自定义
下面将加载应用程序主包中的所有
1 2 3 4 5 6 7 8 | 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; } |
一旦字体被加载,它们就可以像苹果提供的字体一样使用:
1 2 | NSLog(@"Available Font Families: %@", [UIFont familyNames]); [label setFont:[UIFont fontWithName:@"Consolas" size:20.0f]]; |
如果将来API消失,甚至可以在运行时加载graphicssservices:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #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; } |
使用
1)将字体拖放到
2)要使此字体在设备中可用,请打开
如果没有,这篇文章总是对我有帮助。
这是本文中帮助您查找字体名称的代码片段。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | func allFonts(){ for family in UIFont.familyNames(){ println(family) for name in UIFont.fontNamesForFamilyName(family.description) { println(" \(name)") } } } |
编辑
我要提到的是,您需要将字体文件添加到目标的构建阶段,复制捆绑资源。如果没有它,您将无法在设备上看到您的字体。这可能导致意想不到的行为。
例如,我遇到一个
我是这样做的:
加载字体:
1 2 3 4 5 6 7 8 9 | - (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); } |
现在,在你的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | -(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)在字体,但它是有效的。
另外,您必须确保字体是合法嵌入的。大多数人没有,也有专门从事这类事情的律师,所以要受到警告。
如果您使用的是
是的,您可以包括自定义字体。参考有关uifont的文档,特别是
1)确保在资源文件夹中包含字体。
2)字体的"名称"不一定是文件名。
3)确保您具有使用该字体的合法权利。通过将其包含在你的应用程序中,你也在分发它,你需要有权这样做。
下面是如何操作的分步说明。不需要额外的库或任何特殊的编码。
http://shang-liang.com/blog/custom-fonts-in-ios4/
大多数情况下,问题在于字体而不是方法。最好的方法是使用一种字体,如Verdana或Geogia。然后更改为所需的字体。如果不起作用,可能是字体名称不对,或者字体格式不正确。
在现有的iOS应用程序上添加新字体非常容易。
您只需将字体(如FONT.TTF)添加到资源文件夹中即可。
打开应用程序
当设置字体时,请按
您可以检查您的字体是否由
它返回应用程序支持的所有字体。
我建议您遵循我最喜欢的简短教程:http://codewithchris.com/common-errors-with-adding-custom-fonts-to-your-ios-app/,从中获得这些信息。
步骤1-将.ttf或.otf从finder拖到项目中
注意-确保在主应用程序目标上单击"添加到目标"框。
如果忘记单击将其添加到目标中,请单击项目层次结构中的字体文件,然后在右侧面板上单击"目标成员资格"部分中的主应用程序目标。
要确保字体是应用程序目标的一部分,请确保它们在构建阶段显示在复制包资源中。
步骤2-将字体文件名添加到plist
转到"信息"部分中的自定义iOS目标属性,并向该部分中名为
注意-如果您的应用程序在此步骤之后崩溃,请检查您在此处添加的项目的拼写。
第3步-找出字体的名称,以便调用它们
通常情况下,应用程序看到的字体名与您认为基于该字体的文件名的字体名不同,请将其放入代码中,并查看应用程序生成的日志,以查看代码中要调用的字体名。
迅捷
1 2 3 4 5 6 | for family: String in UIFont.familyNames(){ print("\(family)") for names: String in UIFont.fontNamesForFamilyName(family){ print("== \(names)") } } |
目标C
1 2 3 4 5 6 | for (NSString* family in [UIFont familyNames]){ NSLog(@"%@", family); for (NSString* name in [UIFont fontNamesForFamilyName: family]){ NSLog(@" %@", name); } } |
您的日志应该如下所示:
步骤4-使用新的自定义字体,使用步骤3中的名称
迅捷
1 | label.font = UIFont(name:"SourceSansPro-Regular", size: 18) |
目标C
1 | label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18]; |
在finder和"get info"中找到ttf。在标题"全名"下:"它给了我一个名字,然后我用在
它还没有推出,但是下一个版本的cocos2d(二维游戏框架)将支持变长位图字体作为字符映射。
http://code.google.com/p/cocos2d-iphone/issues/detail?ID=317
作者没有这个版本的确切发布日期,但我确实看到了一篇文章,指出它将在下个月或两个月发布。
一个重要的注意事项是:您应该使用与字体相关联的"PostScript名称",而不是它的全名或姓氏。此名称通常与字体的常规名称不同。
我在iOS 3.1.2上尝试了本页面上的各种建议,以下是我的结论:
即使使用fontforge设置了喜欢的名称,只要将
如果首先使用gsfontaddfromfile加载字体,
按此步骤操作
1)在项目中复制字体
2)在源代码模式下打开您的
3)在此之前-右击字体并在fontforge或类似编辑器中打开,在系统中打开
4)键入
1 2 3 4 | <key>UIAppFonts</key> <string>MyriadPro.otf</string> </array> |
5)在您的
1 | [lblPoints setFont:[UIFont fontWithName:@"Myriad Pro" size:15.0]]; |
在这里,从您的
完成!!如果字体仍然不起作用,请先检查字体兼容性
也许作者忘了给字体起一个Mac喜欢的名字?
您也可以在导出对话框中尝试"apple"选项。
免责声明:我不是iPhone开发者!
查找
一个简单的plist条目,允许您在app resources文件夹中包含字体文件,它们在app中"只起作用"。
首先将.odt格式的字体添加到您的资源中,在本例中,我们将使用diningschriftsd.otf,然后使用此代码将字体分配给标签。
1 | [theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]]; |
要确保在项目中加载字体,只需调用
1 | NSLog(@"Available Font Families: %@", [UIFont familyNames]); |
在.plist上,必须声明字体。只需添加一个"应用程序提供的字体"记录,并添加一个带有字体名称的项目0字符串(dinengschriftsd.otf)
对于iOS 3.2及更高版本:使用上述几种方法,即:
但是"真正的字体名"并不总是你在字体簿中看到的那种。最好的方法是问你的设备它看到的字体和确切的名称是什么。
我使用发布在以下网址的UIFONT名称抓取器:字体名称抓取器
只需将您想要的字体放到Xcode项目中,将文件名添加到其plist,并在您正在构建的设备上运行它,它将使用
我已经把这一页上的一些建议结合到iOS 5上的一些东西中。
首先,必须将自定义字体添加到项目中。然后,您需要遵循@iphonedev的建议,并将字体添加到info.plist文件中。
这样做之后,就可以:
1 2 | UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0]; [yourUILabel setFont:yourCustomFont]; |
但是,您需要知道字体的PostScript名称。只要按照@daniel wood的建议,当你在fontbook时按command-i。
然后,享受你的自定义字体。
更好的解决方案是在您的
然后,您可以使用自定义字体,如普通的
有一种使用自定义字体的新方法,从iOS 4.1开始。它允许您动态加载字体,无论是来自应用程序中包含的文件、下载的数据还是您拥有的内容。它还允许您根据需要加载字体,而旧方法在应用程序启动时加载所有字体,如果您有许多字体,这可能会花费太长时间。
在iOS动态字体加载中介绍了新的方法
使用
1 2 3 4 5 6 7 8 9 10 11 | 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); |
Swift,代码方式:(也适用于Swift 2.0)
将所需字体添加到项目中(就像添加图像一样,只需拖动到xcode),确保它们是针对您的项目的。添加此方法并加载自定义字体(在
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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:"") } } |
使用实例:
1 2 3 | if let fontPath = NSBundle.mainBundle().pathForResource("My-Font", ofType:"ttf"){ loadFont(fontPath) } |
使用字体:
1 | UIFont(name:"My-Font", size: 16.5) |
您可以在资源文件夹中添加所需的"字体"文件。然后转到项目
然后您可以调用方法
是的,您可以在应用程序中使用自定义字体
按照以下步骤逐步进行:
在支持文件中将自定义字体文件添加到项目中
在info.plist文件中添加一个名为uiappfonts的键。
使此键成为数组
对于您拥有的每个字体,输入字体文件(包括扩展名)的全名作为uiappfonts数组的项。
立即在应用程序中保存info.plist,您只需调用[uifont font with name:@"您的自定义字体名称"大小:20]即可获得自定义字体,以便与您的uilabels一起使用。应用此字体后,如果字体不正确,则双击自定义字体,仔细查看顶部字体名称是否混合,并复制此字体,粘贴到此处[uifont fontwithname:@"此处超过自定义字体名称"大小:20]
我希望你能得到正确的答案
虽然上面的一些答案是正确的,但我已经为仍然有字体问题的人编写了一个详细的视觉教程。
上面的解决方案告诉您将字体添加到plist并使用
1 | [self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]]; |
是正确的。现在请使用任何其他黑客方式。如果在查找字体名称和添加字体名称时仍然遇到问题,请阅读以下教程-
在iOS应用程序中使用自定义字体
我使一切成为可能,但新字体没有出现,所以我找到了解决方案:
拖动FOT文件(OTF或TTF)时,不要忘记选中"添加到目标"下的复选框。
这样做之后,你的字体就会出现,一切都会正常工作。
是的,您可以在应用程序中使用自定义字体
按照以下步骤逐步进行:
- 在支持文件中将自定义字体文件添加到项目中
- 在您的
Info.plist 文件中添加一个名为uiappfonts的密钥。 - 使此键成为数组
- 对于您拥有的每个字体,输入字体文件(包括扩展名)的全名作为uiappfonts数组的项。
- 保存
Info.plist 。现在,在您的应用程序中,您可以简单地调用[UIFont fontWithName:@"your Custom font Name" size:20] 来获取自定义字体以与UILabels 一起使用。
如果你的字体不正确,在应用这个之后然后双击自定义字体,仔细查看顶部字体名称是否混合。复制这个字体,粘贴,这里是
正如前面所有的答案所指出的,这是非常可能的,并且在较新的iOS版本中相当容易。
我知道这不是一个技术上的答案,但是由于很多人确实犯了错误(因此实际上违反了许可证,如果你被起诉可能会花很多钱),让我在这里加强一个警告:在iOS(或任何其他类型)应用程序中嵌入自定义字体基本上是在重新分配字体。大多数商业字体的许可证都禁止重新发布,因此请确保您是按照许可证行事的。
作为一个增强@bdev的答案,这里有一个只列出自定义字体的更新版本。
步骤1:使用@bdev's answer&save to file查找所有系统字体。
在第一视图控制器的
1 2 3 4 5 6 7 8 9 10 11 12 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSMutableArray *system_fonts = [NSMutableArray array]; for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { [system_fonts addObject:fontName]; } } if([paths count] > 0) { [system_fonts writeToFile:[[paths objectAtIndex:0] stringByAppendingPathComponent:@"array.out"] atomically:YES]; } |
运行应用程序一次。之后停止。
步骤2:向项目添加自定义字体
使用接受答案中显示的方法,添加自定义字体(记住更新
步骤3:将系统字体与当前字体列表进行比较
将步骤1中的代码替换为:
1 2 3 4 5 6 7 8 9 10 11 12 | NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSMutableArray *system_fonts = [NSMutableArray arrayWithContentsOfFile:[[paths objectAtIndex:0] stringByAppendingPathComponent:@"array.out"]]; for (NSString *familyName in [UIFont familyNames]) { for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) { if (![system_fonts containsObject:fontName]) { NSLog(@"%@", fontName); } } } |
运行应用程序,将显示您添加的自定义字体列表。
这适用于iOS 3.2到iOS 6(未来版本可能工作正常)。与