我想让一个应用程序包含一个用于呈现文本的自定义字体,加载它,然后将它与标准UIKit
元素(如UILabel
. 这可能吗?
32 回答
iOS 3.2 及更高版本支持此功能。直接来自iPhone OS 3.2文档中的新增功能:
自定义字体支持
想要使用自定义字体的应用程序现在可以将这些字体包含在其应用程序包中,并通过在其 Info.plist 文件中包含 UIAppFonts 键向系统注册这些字体。该键的值是一个字符串数组,用于标识应用程序包中的字体文件。当系统看到密钥时,它会加载指定的字体并使它们对应用程序可用。
在 中设置字体后Info.plist
,您可以将自定义字体用作 IB 中的任何其他字体或以编程方式使用。
Apple 开发者论坛上有一个正在进行的主题:
https ://devforums.apple.com/thread/37824 (需要登录)
这是一个关于如何实现这一目标的优秀而简单的 3 步教程(已删除断开的链接)
- 使用 Xcode 作为资源将自定义字体文件添加到项目中
- 为您的文件添加一个
Info.plist
名为UIAppFonts
. - 将此键设为数组
- 对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为
UIAppFonts
数组的项目 - 节省
Info.plist
- 现在,在您的应用程序中,您可以简单地调用
[UIFont fontWithName:@"CustomFontName" size:12]
以获取自定义字体以用于您的UILabels和UITextViews等......</li>
另外:确保字体在您的 Copy Bundle Resources 中。
编辑:从 iOS 3.2 开始,这个功能是内置的。如果你需要支持 pre-3.2,你仍然可以使用这个解决方案。
我创建了一个简单的模块来扩展UILabel
和处理加载 .ttf 文件。我在 Apache 许可下将其开源并放在 github 上。
重要的文件是FontLabel.h
和FontLabel.m
。
它使用了Genericrich 回答中的一些代码。
在此处浏览源代码。
或者
将字体文件复制到资源中
向您的文件中添加一个
Info.plist
名为 UIAppFonts 的密钥。(“应用程序提供的字体)将此键设为数组
对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 UIAppFonts 数组的项目
节省
Info.plist
现在在您的应用程序中,您可以简单地调用
[UIFont fontWithName:@"CustomFontName" size:15]
以获取自定义字体以用于您的UILabels
andUITextViews
等...</p>
在iOS 4中有一种使用自定义字体的简单方法。
- 将您的字体文件(例如,
Chalkduster.ttf
)添加到XCode 中项目的Resources文件夹。 - 打开
info.plist
并添加一个名为UIAppFonts
. 这个键的类型应该是数组。 - 将您的自定义字体名称添加到此数组中,包括扩展名 (
Chalkduster.ttf
)。 - 现在您可以
[UIFont fontWithName:@"Chalkduster" size:16]
在您的应用程序中使用。
不幸的是,IB 不允许使用自定义字体初始化标签。看到这个问题来解决这个问题。我最喜欢的解决方案是使用自定义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
我能够成功加载 customUIFont
的唯一方法是通过私有 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;
}
使用iOS 8
+ 和Xcode 6
+ 你可以很容易地做到这一点。以下是步骤:
1) 将字体拖放到Xcode
Supporting Files 文件夹。不要忘记在添加到目标部分标记您的应用程序。从这一刻起,您可以使用此字体IB
并从字体托盘中选择它。
2) 要在您的设备中使用此字体,请打开您的info.plist
并添加Fonts provided by application
密钥。它将包含 Item 0 键,您必须添加您的字体名称作为值。字体名称可能与您的字体文件名不同。但首先,在大多数情况下,尝试添加您的文件名。
如果没有,这篇文章总是对我有帮助。
这是本文中的快速代码片段,可帮助您找到字体名称。
func allFonts(){
for family in UIFont.familyNames(){
println(family)
for name in UIFont.fontNamesForFamilyName(family.description)
{
println(" \(name)")
}
}
}
编辑
我想提一下,您需要将字体文件添加到Target 的 Build Phases,Copy Bundle Resources。没有它,您将不会在设备上看到您的字体。它可能导致意想不到的行为。
例如,我遇到一个bug
, 当UITextField
有自定义字体时,但该字体不在Copy Bundle Resources中。当我继续viewcontroller
使用 this时,在调用函数textfield
之前会有大约 4 秒的延迟。viewDidLoad
解决字体问题消除了这种延迟。所以,建议检查两次。(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),但它可以工作。
此外,您必须确保字体是合法嵌入的。大多数不是,而且有专门从事这类事情的律师,所以要小心。
是的,您可以包含自定义字体。参考 UIFont 的文档,具体来说就是fontWithName:size:
方法。
1)确保在资源文件夹中包含字体。
2)字体的“名称”不一定是文件名。
3) 确保您拥有使用该字体的合法权利。通过将它包含在您的应用程序中,您也在分发它,您需要有权这样做。
如果您正在使用xcode 4.3
,则必须根据线程中的 https://stackoverflow.com/users/1292829/arne 添加font
,Build Phase
自定义Copy Bundle Resources
字体Xcode 4.3。这对我有用,这是我为自定义字体在我的应用程序中工作所采取的步骤:
- 将字体添加到您的项目中。
OTF
我将(或)文件拖放TTF
到我创建的新组中,并接受了 xcode 选择的copying the files over to the project folder
. - 创建
UIAppFonts
数组,将您的字体列为数组中的项目。只是names
,而不是扩展名(例如“GothamBold
”、“GothamBold-Italic
”)。 - 单击屏幕左侧
project name
顶部的路径。Project Navigator
- 单击
Build Phases
出现在 xcode 主要区域中的选项卡。 - 展开“
Copy Bundle Resources
”部分并单击"+"
以添加字体。 - 从文件导航器中选择字体文件,当您单击
"+"
. - 为您必须的每种字体执行此操作
add to the project
。
我建议您在此处遵循我最喜欢的简短教程之一:http: //codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/,此信息来自该教程。
第 1 步 - 将 .ttf 或 .otf 从 Finder 拖到您的项目中
注意 - 确保单击主应用程序目标上的“添加到目标”框
如果您忘记单击将其添加到目标,请单击项目层次结构中的字体文件,然后在右侧面板上单击目标成员部分中的主应用程序目标
为了确保您的字体是您的应用程序目标的一部分,请确保它们显示在构建阶段的复制捆绑资源中
第 2 步 - 将字体文件名添加到您的 Plist
转到您的信息部分中的自定义 iOS 目标属性,并为该部分中的项目添加一个键(您应该在键入时看到它作为一个选项出现,它将自己设置为一个数组。单击小箭头打开数组项并输入您添加的 .ttf 或 .otf 文件的名称,让您的应用知道这些是您想要的字体文件Fonts provided by application
注意 - 如果您的应用在此步骤后立即崩溃,请检查您在此处添加的项目的拼写
第 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];
这是一步一步的说明如何做到这一点。不需要额外的库或任何特殊编码。
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]];
这里的 lblPoints 会随着你的改变而改变UILabel
完毕!!如果您的字体仍然无法正常工作,请先检查您的字体兼容性
也许作者忘记给字体一个Mac FOND 名称?
- 在FontForge中打开字体,然后转到 Element>Font Info
- 有一个“Mac”选项,您可以在其中设置 FOND 名称。
- 在文件>导出字体下,您可以创建一个新的 ttf
您也可以在导出对话框中尝试“Apple”选项。
免责声明:我不是 iPhone 开发者!
我一直在 iOS 3.1.2 上尝试此页面上的各种建议,这些是我的结论:
简单地使用[UIFont fontWithName:size:]
Resources 目录中的字体是行不通的,即使 FOND 名称是使用 FontForge 设置的。
[UIFont fontWithName:size:]
如果首先使用 GSFontAddFromFile 加载字体,它将起作用。但GSFontAddFromFile
它不是 iOS 3.1.2 的一部分,因此必须按照@rpetrich 的描述动态加载。
抬头ATSApplicationFontsPath
一个简单的 plist 条目,允许您将字体文件包含在您的应用程序资源文件夹中,并且它们在您的应用程序中“正常工作”。
更好的解决方案是在Fonts provided by application
您的info.plist
文件中添加一个新属性“”。
然后,您可以像 normal 一样使用自定义字体UIFont
。
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:
预期名称的完整字体列表。
我已将此页面上的一些建议合并到适用于 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 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);
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]];
是正确的。请现在使用任何其他骇人听闻的方式。如果您仍然面临查找字体名称和添加它们的问题,这里是教程 -
是的,您可以在应用程序中使用自定义字体
一步一步跟随那里:
- 在支持文件中将自定义字体文件添加到项目中
- 向您的文件中添加一个
Info.plist
名为 UIAppFonts 的密钥。 - 将此键设为数组
- 对于您拥有的每种字体,输入字体文件的全名(包括扩展名)作为 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] 即可在应用此自定义字体后与您的 UILabels 一起使用,如果您没有获得正确的字体,则双击在自定义字体上,仔细查看顶部字体名称并复制此字体,粘贴到此处 [UIFont fontWithName:@" here past your Custom font Name" size:20]
我希望你能得到正确的答案
作为@bdev's answer的增强,这里是仅列出自定义字体的更新版本。
第 1 步:使用@bdev 的答案找出所有系统字体并保存到文件。
将以下代码放在第一个 View Controller 中-(void)viewDidLoad
,之后[super viewDidLoad]
(或在 App Delegate 中):
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
。
正如所有先前的答案所表明的那样,这很有可能,并且在较新的 iOS 版本中非常容易。
我知道这不是一个技术性的答案,但是由于很多人确实做错了(因此实际上违反了许可证,如果你被起诉可能会花费你很多钱),让我在这里强调一个警告:嵌入自定义iOS(或任何其他类型)应用程序中的字体基本上是重新分配字体。大多数商业字体的许可证都禁止重新分发,因此请确保您按照许可证行事。