我想让一个应用程序包含用于呈现文本的自定义字体,加载它,然后将其与标准 UIKit
元素(如 UILabel
)一起使用。这可能吗?
iOS 3.2 及更高版本支持此功能。直接来自 iPhone OS 3.2 文档中的新增功能:
自定义字体支持想要使用自定义字体的应用程序现在可以将这些字体包含在其应用程序包中,并通过在其 Info.plist 文件中包含 UIAppFonts 键向系统注册这些字体。该键的值是一个字符串数组,用于标识应用程序包中的字体文件。当系统看到密钥时,它会加载指定的字体并使它们对应用程序可用。
在 Info.plist
中设置字体后,您可以将自定义字体用作 IB 中的任何其他字体或以编程方式使用。
Apple 开发者论坛上有一个正在进行的主题:
https://devforums.apple.com/thread/37824(需要登录)
这是一个关于如何实现这一目标的优秀而简单的 3 步教程(已删除断开的链接)
使用 Xcode 作为资源将自定义字体文件添加到项目中 添加一个名为 UIAppFonts 的 Info.plist 文件的键。将此键设为数组对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目保存 Info.plist 现在在您的应用程序中,您可以简单地调用 [UIFont fontWithName:@"CustomFontName" size:12] 获取自定义字体以与您的 UILabels 和 UITextViews 等一起使用……
另外:确保字体在您的 Copy Bundle Resources 中。
编辑:从 iOS 3.2 开始,这个功能是内置的。如果你需要支持 pre-3.2,你仍然可以使用这个解决方案。
我创建了一个扩展 UILabel
并处理加载 .ttf 文件的简单模块。我在 Apache 许可下将其开源并放在 github Here.
重要的文件是 FontLabel.h
和 FontLabel.m
。
它使用 Genericrich's answer 中的一些代码。
浏览源 Here.
或者
将字体文件复制到资源中
向名为 UIAppFonts 的 Info.plist 文件添加一个键。 (“应用程序提供的字体)
将此键设为数组
对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目
保存信息.plist
现在在您的应用程序中,您可以简单地调用 [UIFont fontWithName:@"CustomFontName" size:15] 来获取自定义字体以用于您的 UILabel 和 UITextViews 等...
在 iOS 4 中有一种使用自定义字体的简单方法。
将您的字体文件(例如,Chalkduster.ttf)添加到 XCode 中项目的 Resources 文件夹。打开 info.plist 并添加一个名为 UIAppFonts 的新键。这个键的类型应该是数组。将您的自定义字体名称添加到此数组,包括扩展名 (Chalkduster.ttf)。现在您可以在您的应用程序中使用 [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
在 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]];
编辑:此答案自 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;
}
加载字体后,就可以像使用 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;
}
[NSString sizeWithFont:[UIFont fontWithName:@"customFont" size:14]];
都会返回 0 宽度和高度。
使用 iOS 8
+ 和 Xcode 6
+,您可以轻松做到这一点。以下是步骤:
1) 将您的字体拖放到 Xcode
Supporting Files 文件夹。不要忘记在添加到目标部分标记您的应用。从此时起,您可以在 IB
中使用该字体并从字体托盘中选择它。
https://i.stack.imgur.com/Ovbpb.png
2) 要在您的设备中使用此字体,请打开您的 info.plist
并添加 Fonts provided by application
键。它将包含 Item 0 键,您必须添加您的字体名称作为值。字体名称可能与您的字体文件名不同。但首先,在大多数情况下,尝试添加您的文件名。
https://i.stack.imgur.com/ak315.png
如果没有,this article 总是帮助我。
这是本文中的快速代码片段,可帮助您找到字体名称。
func allFonts(){
for family in UIFont.familyNames(){
println(family)
for name in UIFont.fontNamesForFamilyName(family.description)
{
println(" \(name)")
}
}
}
编辑
我想提一下,您需要将字体文件添加到目标的构建阶段,复制捆绑资源。没有它,您将不会在设备上看到您的字体。它可能导致意想不到的行为。
例如,当 UITextField
有自定义字体时,我遇到了一个 bug
,但该字体不在 Copy Bundle Resources 中。当我用这个 textfield
转到 viewcontroller
时,在调用 viewDidLoad
函数之前会有大约 4 秒的延迟。解决字体问题消除了这种延迟。所以,建议检查两次。 (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),但它可以工作。
此外,您必须确保字体是合法嵌入的。大多数不是,而且有专门从事这类事情的律师,所以要小心。
CGContextShowTextAtPoint()
——尽管它不适用于 UTF-8。
是的,您可以包含自定义字体。请参阅有关 UIFont 的文档,特别是 fontWithName:size:
方法。
1)确保在资源文件夹中包含字体。
2)字体的“名称”不一定是文件名。
3) 确保您拥有使用该字体的合法权利。通过将它包含在您的应用程序中,您也在分发它,您需要有权这样做。
如果您使用 xcode 4.3
,则必须根据线程 Custom Fonts Xcode 4.3 中的 https://stackoverflow.com/users/1292829/arne 将 font
添加到 Copy Bundle Resources
下的 Build Phase
。这对我有用,这是我为自定义字体在我的应用程序中工作所采取的步骤:
将字体添加到您的项目中。我将 OTF(或 TTF)文件拖放到我创建的新组中,并接受了 xcode 将文件复制到项目文件夹的选择。创建 UIAppFonts 数组,将您的字体列为数组中的项目。只是名称,而不是扩展名(例如“GothamBold”、“GothamBold-Italic”)。点击屏幕左侧 Project Navigator 顶部的项目名称方式。单击出现在 xcode 主要区域中的 Build Phases 选项卡。展开“复制捆绑资源”部分并单击“+”以添加字体。当您单击“+”时,从弹出的文件导航器中选择字体文件。对您必须添加到项目中的每种字体执行此操作。
我建议您在此处遵循我最喜欢的简短教程之一:http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/,此信息来自该教程。
第 1 步 - 将 .ttf 或 .otf 从 Finder 拖到您的项目中
注意 - 确保单击主应用程序目标上的“添加到目标”框
https://i.stack.imgur.com/U611W.png
如果您忘记单击将其添加到目标,请单击项目层次结构中的字体文件,然后在右侧面板上单击目标成员部分中的主应用程序目标
https://i.stack.imgur.com/PhI5I.png
为了确保您的字体是您的应用程序目标的一部分,请确保它们显示在构建阶段的复制捆绑资源中
https://i.stack.imgur.com/awWkY.png
第 2 步 - 将字体文件名添加到您的 Plist
转到 Info 部分中的 Custom iOS Target Properties 并为该部分中名为 Fonts provided by application
的项目添加一个键(您应该会看到它作为一个选项出现你输入它,它就会将自己设置为一个数组。单击小箭头打开数组项并输入你添加的 .ttf 或 .otf 文件的名称,让你的应用程序知道这些是字体文件你想要可用
注意 - 如果您的应用在此步骤后立即崩溃,请检查您在此处添加的项目的拼写
https://i.stack.imgur.com/kiVl8.png
第 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);
}
}
您的日志应如下所示:
https://i.stack.imgur.com/bR2xl.png
第 4 步 - 使用第 3 步中的名称使用新的自定义字体
迅速
label.font = UIFont(name: "SourceSansPro-Regular", size: 18)
目标 C
label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
这是一步一步的说明如何做到这一点。不需要额外的库或任何特殊编码。
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];
检查您的字体是否被添加。
它返回您的应用程序支持的所有字体。
在查找器和“获取信息”中找到 TTF。在标题“全名:”下,它给了我一个名称,然后我将其与 fontWithName
一起使用(我只是复制并粘贴了确切的名称,在这种情况下不需要“.ttf”扩展名)。
还没有出来,但是下一个版本的 cocos2d(2d 游戏框架)会支持变长位图字体作为字符映射。
http://code.google.com/p/cocos2d-iphone/issues/detail?id=317
作者没有确定此版本的发布日期,但我确实看到一个帖子表明它将在未来一两个月内发布。
一个重要的注意事项:您应该使用与字体关联的“PostScript 名称”,而不是其全名或姓氏。此名称通常与字体的正常名称不同。
按照这个步骤
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]];
自您的 UILabel
起,这里的 lblPoints 将发生变化
完毕!!如果您的字体仍然无法正常工作,请先检查您的字体兼容性
info.plist
?
也许作者忘记给字体一个Mac FOND name?
在 FontForge 中打开字体,然后转到 Element>Font Info 有一个“Mac”选项,您可以在其中设置 FOND 名称。在文件>导出字体下,您可以创建一个新的 ttf
您也可以在导出对话框中尝试“Apple”选项。
免责声明:我不是 iPhone 开发者!
我一直在 iOS 3.1.2 上尝试此页面上的各种建议,这些是我的结论:
即使使用 FontForge 设置了 FOND 名称,简单地使用 [UIFont fontWithName:size:]
和 Resources 目录中的字体也是行不通的。
如果首先使用 GSFontAddFromFile 加载字体,[UIFont fontWithName:size:]
将起作用。但是 GSFontAddFromFile
不是 iOS 3.1.2 的一部分,因此它必须按照@rpetrich 的描述动态加载。
查找ATSApplicationFontsPath
一个简单的 plist 条目,允许您将字体文件包含在您的应用程序资源文件夹中,并且它们在您的应用程序中“正常工作”。
我已将此页面上的一些建议合并到适用于 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 即可。
然后,享受您的自定义字体。
首先将 .odt 格式的字体添加到您的资源中,在这种情况下,我们将使用 DINEngschriftStd.otf,然后使用此代码将字体分配给标签
[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];
要确保您的字体已加载到项目中,只需调用
NSLog(@"Available Font Families: %@", [UIFont familyNames]);
在 .plist 上,您必须声明字体。只需添加“应用程序提供的字体”记录并添加带有字体名称的项目 0 字符串 (DINEngschriftStd.otf)
iOS 3.2及以上:使用上面几个提供的方法,分别是:
将您的字体文件(例如,Chalkduster.ttf)添加到 XCode 中项目的 Resources 文件夹。打开 info.plist 并添加一个名为 UIAppFonts 的新键。这个键的类型应该是数组。将您的自定义字体名称添加到此数组中,包括扩展名(“Chalkduster.ttf”)。在您的应用程序中使用 [UIFont fontWithName:@"Real Font Name" size:16]。
但是“真实字体名称”并不总是您在 Fontbook 中看到的那个。最好的方法是询问您的设备它看到哪些字体以及确切的名称是什么。
我使用 uifont-name-grabber 发布于:uifont-name-grabber
只需将您想要的字体放到 xcode 项目中,将文件名添加到它的 plist 中,然后在您正在构建的设备上运行它,它将使用 UIFont fontWithName:
期望的名称通过电子邮件发送给您一个完整的字体列表。
更好的解决方案是将新属性“Fonts provided by application
”添加到您的 info.plist
文件中。
然后,您可以像普通 UIFont
一样使用自定义字体。
从 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);
kCTFontManagerErrorAlreadyRegistered
,“文件已在指定范围内注册”。 developer.apple.com/library/ios/#documentation/Carbon/Reference/…
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
文件并使用“应用程序提供的字体”键和值作为“字体名称”。
然后您可以调用方法 [UIFont fontwithName:@"FONT NAME" size:12];
我使一切成为可能,但没有出现新字体,所以我找到了解决方案:
当您拖动 fot 文件(otf 或 ttf)时,不要忘记选中“添加到目标”下的复选框。
这样做之后,您的字体将出现,一切都会正常工作。
虽然上面的一些答案是正确的,但我已经为仍然遇到字体问题的人写了一个详细的视觉教程。
上面的解决方案告诉您将字体添加到 plist 并使用
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];
是正确的。请现在使用任何其他骇人听闻的方式。如果您仍然面临查找字体名称和添加它们的问题,这里是教程 -
Using custom fonts in ios application
是的,您可以在应用程序中使用自定义字体
一步一步跟随那里:
在支持文件中将自定义字体文件添加到项目中
向名为 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]
我希望你能得到正确的答案
是的,您可以在应用程序中使用自定义字体
一步一步跟随那里:
在支持文件中将自定义字体文件添加到项目中
向名为 UIAppFonts 的 Info.plist 文件添加一个键。
将此键设为数组
对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目
保存 Info.plist 现在在您的应用程序中,您可以简单地调用 [UIFont fontWithName:@"your Custom font Name" size:20] 来获取与您的 UILabel 一起使用的自定义字体
应用此功能后,如果您没有获得正确的字体,则双击自定义字体,并仔细查看顶部字体名称正在出现并复制此字体,粘贴到此处[UIFont fontWithName:@" here past your Custom font Name" size:20]
,希望您能得到正确的答案