此问题与iOS 3.2之前的版本有关。从3.2开始,使用下面的samvermette答案很容易实现这个功能,我已经改变了接受的答案(从命令到samvermette)以反映这一点。我不能赞同这两个答案(除了upvotes),但它们都很好。
我希望有一个应用程序包含用于呈现文本的自定义字体,加载它,然后将其用于UIKit
等标准UILabel
元素。这可能吗?
我在下面找到了链接:
但是这些要求我自己渲染每个字形,这有点太辛苦了,特别是对于多行文字。
我也发现帖子直截了当地说这是不可能的,但没有理由,所以我正在寻找一个明确的答案。
编辑 - -[UIFont fontWithName:size:]
实验失败
我下载了Harrowprint.tff(从here下载)并将其添加到我的Resources目录和项目中。然后我尝试了这段代码:
UIFont* font = [UIFont fontWithName:@"Harrowprint" size:20];
导致抛出异常。查看Finder中的TTF文件,确认字体名称为Harrowprint。
编辑 - 到目前为止已经有很多回复告诉我阅读X或Y上的文档。我已经对所有这些进行了广泛的实验并且无处可去。在一个案例中,X结果仅与OS X相关,而不是在iPhone上。因此,我正在为这个问题设置一个赏金,我将奖励给第一个提供答案的人(仅使用文档化的API),他们会回答足够的信息以使其在设备上运行。在模拟器上工作也是一个奖励。
编辑 - 看来奖金会以最高票数自动奖励回答。有趣。实际上没有人提供解决问题的答案 - 涉及编码自己的UILabel
子类的解决方案不支持自动换行,这对我来说是一个必不可少的功能 - 尽管我想我可以将它扩展到这样做。
答案 0 :(得分:638)
iOS 3.2及更高版本支持此功能。直接来自 iPhone OS 3.2中的新功能 doc:
自定义字体支持
想要使用自定义字体的应用程序现在可以在其应用程序包中包含这些字体,并通过在其Info.plist文件中包含UIAppFonts键来向系统注册这些字体。此键的值是一个字符串数组,用于标识应用程序包中的字体文件。当系统看到密钥时,它会加载指定的字体并使其可供应用程序使用。
在Info.plist
中设置字体后,您可以将自定义字体用作IB中的任何其他字体或以编程方式使用。
Apple Developer论坛上有一个持续的主题:
https://devforums.apple.com/thread/37824(需要登录)
这是一个非常简单的3步教程,介绍如何实现这一目标(删除断开的链接)
Info.plist
的{{1}}文件中添加密钥。UIAppFonts
数组UIAppFonts
Info.plist
即可获取与 UILabels 和 UITextViews 等相关的自定义字体... 另外:确保字体位于Copy Bundle Resources中。
答案 1 :(得分:297)
编辑:从iOS 3.2开始,内置了此功能。如果您需要支持3.2之前的版本,您仍然可以使用此解决方案。
我创建了一个扩展UILabel
并处理加载.ttf文件的简单模块。我在Apache许可下发布了opensource并将其放在github Here.
重要文件为FontLabel.h
和FontLabel.m
。
它使用Genericrich's answer中的部分代码。
浏览来源Here.
OR
将您的字体文件复制到资源
在名为UIAppFonts的Info.plist
文件中添加密钥。 (“申请提供的字体”
将此密钥设为数组
对于您拥有的每种字体,请输入字体文件的全名(包括扩展名)作为UIAppFonts数组的项目
保存Info.plist
现在,在您的应用程序中,您只需致电[UIFont fontWithName:@"CustomFontName" size:15]
即可获取与UILabels
和UITextViews
等一起使用的自定义字体...
答案 2 :(得分:115)
在 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
答案 3 :(得分:51)
在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]];
答案 4 :(得分:36)
编辑:从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;
}
答案 5 :(得分:34)
使用iOS 8
+和Xcode 6
+,您可以轻松完成此操作。以下是步骤:
1)将您的字体拖放到Xcode
Supporting Files文件夹。不要忘记在添加到目标部分标记您的应用。从此刻开始,您可以在IB
中使用此字体,并从字体托盘中选择它。
2)要在您的设备中使用此字体,请打开info.plist
并添加Fonts provided by application
键。它将包含Item 0键,您必须添加您的字体名称作为值。字体名称可能与您的字体文件名不同。但首先,尝试在大多数情况下添加您的文件名。
如果没有,this article总是帮助我。
以下是本文代码的快速摘要,可帮助您找到字体名称。
func allFonts(){
for family in UIFont.familyNames(){
println(family)
for name in UIFont.fontNamesForFamilyName(family.description)
{
println(" \(name)")
}
}
}
我想提一下,您需要将字体文件添加到目标的构建阶段,复制捆绑资源。没有它,您将无法在设备上看到您的字体。它可能会导致意外行为。
例如,当bug
具有自定义字体时,我遇到UITextField
,但此字体不在复制捆绑资源中。当我使用此viewcontroller
转换到textfield
时,在调用viewDidLoad
函数之前会有大约4秒的延迟。解决字体问题消除了此延迟。所以,建议检查两次。 (rdar:// 20028250)顺便说一句,我无法重现这个bug,但我确定问题出现在字体上。
答案 6 :(得分: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);
}
现在,在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),但它确实有效。
此外,您必须确保该字体是合法嵌入的。大多数都不是,并且有律师专门研究这类事情,所以请加以警告。
答案 7 :(得分:20)
是的,您可以包含自定义字体。请参阅有关UIFont的文档,特别是fontWithName:size:
方法。
1)确保在资源文件夹中包含该字体。
2)字体的“名称”不一定是文件名。
3)确保您拥有使用该字体的合法权利。通过将其包含在您的应用中,您还可以分发它,并且您需要有权这样做。
答案 8 :(得分:20)
如果您使用的是xcode 4.3
,则必须根据帖子中的https://stackoverflow.com/users/1292829/arne font
将Build Phase
添加到Copy Bundle Resources
下的OTF
TTF
3}}。这对我有用,以下是我在我的应用程序中使用自定义字体的步骤:
copying the files over to the project folder
(或UIAppFonts
)个文件拖放到我创建的新组中,并接受xcode选择的names
。GothamBold
数组,并将字体列为数组中的项目。只是GothamBold-Italic
,而不是扩展名(例如“project name
”,“Project Navigator
”)。Build Phases
顶部的Copy Bundle Resources
方式。"+"
标签。"+"
”部分,然后点击add to the project
添加字体。答案 9 :(得分:12)
在现有iOS应用中添加新字体非常容易。
您只需要添加字体,例如将font.ttf放入资源文件夹。
打开您的应用info.plist
。添加一个新行作为&#34;由应用程序提供的字体&#34;并键入字体名称font.ttf。
设置字体时请执行setFont:"corresponding Font Name"
您可以NSArray *check = [UIFont familyNames];
检查是否添加了字体。
它返回应用程序支持的所有字体。
答案 10 :(得分:12)
以下是逐步说明如何操作的说明。无需额外的库或任何特殊编码。
http://shang-liang.com/blog/custom-fonts-in-ios4/
大多数情况下,问题在于字体而不是方法。最好的方法是使用肯定会起作用的字体,如verdana或geogia。然后更改为预期的字体。如果它不起作用,可能是字体名称不对,或者字体不是格式良好的字体。
答案 11 :(得分:11)
我建议您按照我最喜欢的简短教程之一:http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/从中获取此信息。
第1步 - 将.ttf或.otf从Finder拖到您的项目中
注意 - 请务必点击“添加到目标”框。在您的主要应用目标
如果您忘记单击将其添加到目标,请单击项目层次结构中的字体文件,然后在右侧面板中单击目标成员部分中的主应用目标
要确保您的字体是应用目标的一部分,请确保它们显示在构建阶段 中的复制包资源中
第2步 - 将字体文件名添加到Plist 转到信息部分中的自定义iOS目标属性,并为该部分中名为 注意 - 如果您的应用在此步骤后立即崩溃,请检查您在此处添加的项目的拼写 第3步 - 找出字体的名称,以便您可以调用它们 您的应用程序看到的字体名称通常与您认为的字体名称不同,基于该字体的文件名,将其放入您的代码中并查看您的应用程序所做的日志,以查看您的应用程序中要调用的字体名称代码 夫特 目标C 您的日志应如下所示: 第4步 - 使用步骤3中的名称 夫特 目标C Fonts provided by application
的项添加一个键(您应该看到它来了)当你输入它时它作为一个选项,它将自己设置为一个数组。单击小箭头打开数组项并输入你添加的.ttf或.otf文件的名称,让你的应用知道这些是你想要的字体文件for family: String in UIFont.familyNames(){
print("\(family)")
for names: String in UIFont.fontNamesForFamilyName(family){
print("== \(names)")
}
}
for (NSString* family in [UIFont familyNames]){
NSLog(@"%@", family);
for (NSString* name in [UIFont fontNamesForFamilyName: family]){
NSLog(@" %@", name);
}
}
label.font = UIFont(name: "SourceSansPro-Regular", size: 18)
label.font = [UIFont fontWithName:@"SourceSansPro-Regular" size:18];
答案 12 :(得分:10)
在finder中找到TTF并“获取信息”。在“全名:”标题下,它给了我一个名称,然后我与fontWithName
一起使用(我只是复制并粘贴了确切的名称,在这种情况下,不需要'.ttf'扩展名。)
答案 13 :(得分:8)
尚未推出,但下一版cocos2d(2d游戏框架)将支持可变长度位图字体作为字符映射。
http://code.google.com/p/cocos2d-iphone/issues/detail?id=317
作者没有确定此版本的发布日期,但我确实看到了一个帖子,表明它将在下个月或两个月内发布。
答案 14 :(得分:8)
一个重要提示:您应该使用与字体相关联的“PostScript名称”,而不是其全名或姓氏。此名称通常可以与字体的正常名称不同。
答案 15 :(得分:6)
我一直在iOS 3.1.2上尝试这个页面上的各种建议,这些是我的结论:
即使使用FontForge设置了FOND名称,只需将[UIFont fontWithName:size:]
与Resources目录中的字体一起使用也行不通。
[UIFont fontWithName:size:]
将起作用。但GSFontAddFromFile
不是iOS 3.1.2的一部分,因此必须按照@rpetrich的描述动态加载。
答案 16 :(得分:6)
也许作者忘了给字体Mac FOND name?
您也可以尝试在导出对话框中输入“Apple”选项。
免责声明:我不是iPhone开发人员!
答案 17 :(得分:6)
按照此步骤
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]];
此处lblPoints将从UILabel
完成! 如果您的字体仍无效,请先检查字体兼容性
答案 18 :(得分:5)
更好的解决方案是在您的Fonts provided by application
文件中添加新属性“info.plist
”。
然后,您可以像普通UIFont
一样使用自定义字体。
答案 19 :(得分:5)
适用于iOS 3.2及以上版本: 使用上面几个提供的方法,这些方法是:
[UIFont fontWithName:@"Real Font Name" size:16]
。<强> BUT 强> “真实字体名称”并不总是您在Fontbook中看到的那个。最好的方法是询问您的设备它看到的字体以及确切的名称。
我使用的是uifont-name-grabber: uifont-name-grabber
只需将您想要的字体放入xcode项目,将文件名添加到其plist,然后在您正在构建的设备上运行它,它将使用UIFont fontWithName:
的名称通过电子邮件向您发送完整的字体列表预计。
答案 20 :(得分: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时按下命令即可。
然后,享受您的自定义字体。
答案 21 :(得分:5)
首先将.odt格式的字体添加到资源中,在这种情况下我们将使用DINEngschriftStd.otf,然后使用此代码将字体分配给标签
[theUILabel setFont:[UIFont fontWithName:@"DINEngschriftStd" size:21]];
要确保您的字体已加载到项目中,请致电
NSLog(@"Available Font Families: %@", [UIFont familyNames]);
在.plist上,您必须声明字体。只需添加“由应用程序提供的字体”记录,并添加一个带有字体名称的项目0字符串(DINEngschriftStd.otf)
答案 22 :(得分:5)
查找ATSApplicationFontsPath
一个简单的plist条目,允许您将字体文件包含在应用资源文件夹中,并且它们在您的应用中“正常工作”。
答案 23 :(得分:3)
从iOS 4.1开始,有一种使用自定义字体的新方法。它允许您动态加载字体,无论是应用程序附带的文件,下载的数据,还是您拥有的内容。它还允许您根据需要加载字体,而旧方法在应用程序启动时加载它们,如果您有许多字体,这可能需要很长时间。
描述了新方法使用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);
答案 24 :(得分:3)
将所需的字体添加到项目中(就像添加图像一样,只需拖动到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)
答案 25 :(得分:2)
您可以在资源文件夹中添加所需的“FONT”文件。然后转到Project Info.plist
文件并使用KEY“应用程序提供的字体”,并将值设置为“FONT NAME”。
然后你可以调用方法[UIFont fontwithName:@"FONT NAME" size:12];
答案 26 :(得分:1)
我尽一切可能,但新字体没有显示,所以我找到了解决方案:
当您拖动fot文件(otf或ttf)时,请忘记选中“添加到目标”下的复选框。
完成后,您的字体将出现,一切都会正常。
答案 27 :(得分:1)
是的,您可以在应用程序中使用自定义字体
在那之后一步一步:
将自定义字体文件添加到支持文件的项目中
在名为UIAppFonts的Info.plist文件中添加一个密钥。
将此键设为数组
对于您拥有的每种字体,请输入字体文件的全名(包括扩展名)作为UIAppFonts数组的项目
保存Info.plist现在您的应用程序中只需调用[UIFont fontWithName:@“您的自定义字体名称”大小:20]即可获得与UILabels一起使用的自定义字体 如果你没有得到正确的字体应用这个后,你双击自定义字体,仔细看看顶部字体名称是来了并复制这个字体,粘贴,这里[UIFont fontWithName:@“这里超过你的自定义字体名称”大小: 20]
我希望你能得到正确答案
答案 28 :(得分:1)
是的,您可以在应用程序中使用自定义字体
在那之后一步一步:
Info.plist
文件中添加密钥。Info.plist
现在,在您的应用程序中,您只需致电[UIFont fontWithName:@"your Custom font Name" size:20]
即可获取与UILabels
然后双击自定义字体,仔细查看顶部字体名称即将到来
并复制此字体,粘贴,[UIFont fontWithName:@" here past your Custom font Name" size:20]
我希望你能得到正确答案
答案 29 :(得分:1)
虽然上面的一些答案是正确的,但我已经为那些仍然遇到字体问题的人写了详细的视觉教程。
上面的解决方案告诉您将字体添加到plist并使用
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];
是正确的。请现在使用任何其他hackish方式。如果您仍然遇到查找字体名称和添加字体名称的问题,请参阅教程 -
答案 30 :(得分:0)
作为增强版@ bdev的answer,这是一个更新版本,仅列出自定义字体。
第1步:使用@ bdev的答案找出所有系统字体&amp;保存到文件。
在-(void)viewDidLoad
之后(或在App Delegate中)将以下代码放在第一个View Controller的[super viewDidLoad]
中:
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步:将自定义字体添加到项目
使用接受答案中显示的方法添加自定义字体(请记得更新.plist
并通过选中Add To Target
添加要构建的字体文件。
步骤3:将系统字体与当前字体列表进行比较
将步骤1中的代码替换为:
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(未来版本可能正常工作)。适用于.ttc
和.ttf
。
答案 31 :(得分:0)
正如之前的所有答案所表明的那样,它非常有可能,并且在较新的iOS版本中非常容易。
我知道这不是技术上的答案,但是由于很多人确实做错了(因此有效地违反了许可证,如果你被起诉可能会花费你很多钱),让我在这里加强一点警告:在iOS(或任何其他类型)应用中嵌入自定义字体基本上重新分发字体。大多数商业字体许可证禁止重新分发,因此请确保您按照许可证行事。