我想要一个包含自定义字体的应用程序,用于呈现文本,加载文本,然后将其与UIKit
诸如的标准元素一起使用UILabel
。这可能吗?
我想要一个包含自定义字体的应用程序,用于呈现文本,加载文本,然后将其与UIKit
诸如的标准元素一起使用UILabel
。这可能吗?
Answers:
iOS 3.2及更高版本支持此功能。直接来自iPhone OS 3.2文档的新增功能:
自定义字体支持
现在,想要使用自定义字体的应用程序可以在其应用程序包中包含这些字体,并通过在其Info.plist文件中包含UIAppFonts键在系统中注册这些字体。该键的值是一个字符串数组,用于标识应用程序捆绑包中的字体文件。当系统看到密钥时,它将加载指定的字体并将其提供给应用程序。
在中设置了字体后Info.plist
,您可以将自定义字体用作IB中的任何其他字体,也可以以编程方式使用。
苹果开发者论坛上有一个正在进行的线程:
https : //devforums.apple.com/thread/37824(需要登录)
这是关于如何实现此目标的出色且简单的3个步骤的教程(断开的链接已删除)
Info.plist
文件中添加一个密钥UIAppFonts
。UIAppFonts
数组项Info.plist
[UIFont fontWithName:@"CustomFontName" size:12]
以获取与UILabels和UITextViews等一起使用的自定义字体。另外:确保字体在您的副本捆绑资源中。
编辑:从iOS 3.2开始,此功能是内置的。如果需要支持3.2之前的版本,仍可以使用此解决方案。
我创建了一个扩展的简单模块 UILabel
并处理.ttf文件的加载。我在Apache许可下将其开源发布,并将其放在github 这里。
重要文件是 FontLabel.h
和FontLabel.m
。
它使用了一些代码 Genericrich的答案中的。
浏览源 此处。
要么
将字体文件复制到资源中
将密钥添加到您的 Info.plist
名为UIAppFonts文件中。(“应用程序提供的字体)
将此键设为数组
对于每种字体,输入字体文件的全名(包括扩展名)作为UIAppFonts数组的项目
救 Info.plist
现在,在您的应用程序中,您只需调用[UIFont fontWithName:@"CustomFontName" size:15]
即可获取与UILabels
和UITextViews
等配合使用的自定义字体。
在iOS 4中有一种使用自定义字体的简单方法。
Chalkduster.ttf
)添加到参考资料 XCode中项目的文件夹中。info.plist
并添加一个名为UIAppFonts
。此项的类型应为array。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
我能够成功加载custom 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]];
如果将来API消失,甚至可以在运行时加载GraphicsServices:
#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
并从字体托盘中选择它。
2)要使该字体在您的设备中可用,请打开info.plist
并添加Fonts provided by application
密钥。它将包含项0键,您必须添加您的字体名称作为值。字体名称可能与您的字体文件名称不同。但首先,在大多数情况下,请尝试添加文件名。
如果没有,这篇文章总是对我有帮助。
这是本文中的代码的快速摘要,可帮助您找到字体名称。
func allFonts(){
for family in UIFont.familyNames(){
println(family)
for name in UIFont.fontNamesForFamilyName(family.description)
{
println(" \(name)")
}
}
}
我要提到的是,您需要将字体文件添加到目标的构建阶段,复制捆绑资源。没有它,您将无法在设备上看到字体。这可能会导致意外的行为。
例如,bug
当UITextField
使用自定义字体时,我遇到一个,但是该字体不在Copy Bundle Resources中。当我viewcontroller
使用this进行搜索时textfield
,在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
,则必须根据自定义字体Xcode 4.3中的https://stackoverflow.com/users/1292829/arne将其添加font
到Build Phase
下面。这对我有用,这是我为使自定义字体在我的应用中工作而采取的步骤:Copy Bundle Resources
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://shang-liang.com/blog/custom-fonts-in-ios4/
在大多数情况下,问题出在字体而不是方法上。最好的方法是使用肯定可以使用的字体,例如verdana或geogia。然后更改为所需的字体。如果不起作用,则可能是字体名称不正确,或者字体格式不正确。
我建议在此遵循我最喜欢的简短教程之一: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];
尚未发布,但下一版本的cocos2d(2d游戏框架)将支持可变长度的位图字体作为字符映射。
http://code.google.com/p/cocos2d-iphone/issues/detail?id=317
作者没有确定该版本的发布日期,但是我确实看到有帖子指出它将在下一两个月内发布。
按照此步骤
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
做完了!如果仍然无法使用字体,请先检查字体兼容性
info.plist
?
也许作者忘记为字体赋予Mac FOND名称?
您也可以尝试在导出对话框中使用“ Apple”选项。
免责声明:我不是iPhone开发人员!
抬头 ATSApplicationFontsPath
一个简单的plist条目,允许您将字体文件包含在应用程序资源文件夹中,并且它们在您的应用程序中“有效”。
我已将本页上的一些建议合并为适用于iOS 5的内容。
首先,您必须将自定义字体添加到您的项目。然后,您需要遵循@iPhoneDev的建议,并将字体添加到info.plist文件中。
完成此操作后,它将起作用:
UIFont *yourCustomFont = [UIFont fontWithName:@"YOUR-CUSTOM-FONT-POSTSCRIPT-NAME" size:14.0];
[yourUILabel setFont:yourCustomFont];
但是,您需要知道字体的Postscript名称。在FontBook中时,只需遵循@Daniel Wood的建议并按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及更高版本:使用上述几种提供的方法:
[UIFont fontWithName:@"Real Font Name" size:16]
在您的应用程序中使用。但是 “真实字体名称”并不总是在Fontbook中看到的。最好的方法是询问设备看到的字体以及确切的名称。
我使用uifont-name-grabber发布的 uifont-name-grabber
只需将所需字体放到xcode项目中,将文件名添加到其plist中,然后在要为其构建设备的设备上运行它,它将使用UIFont fontWithName:
期望的名称通过电子邮件将完整的字体列表发送给您。
从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/...
将所需的字体添加到您的项目中(就像添加图像一样,只需将其拖到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)
尽管上面的某些答案是正确的,但我为仍然遇到字体问题的人编写了详细的视觉教程。
上面的解决方案告诉您将字体添加到plist并使用
[self.labelOutlet setFont:[UIFont fontWithName:@"Sathu" size:10]];
是正确的。现在请使用其他任何骇客方式。如果您在查找字体名称并添加它们时仍遇到问题,请参见本教程-
是的,您可以在应用程序中使用自定义字体
一步一步跟随那里:
在支持文件中将自定义字体文件添加到项目中
将一个密钥添加到名为UIAppFonts的Info.plist文件中。
将此键设为数组
对于每种字体,输入字体文件的全名(包括扩展名)作为UIAppFonts数组的项目
保存Info.plist现在,在您的应用程序中,您可以简单地调用[UIFont fontWithName:@“您的自定义字体名称” size:20]以获取自定义字体,然后将其应用于UILabels(如果您使用的字体不正确),然后双击在自定义字体上,并仔细查看顶部字体名称即将到来并将其复制并粘贴,在此处[UIFont fontWithName:@“在此处超过您的自定义字体名称”,大小:20]
我希望你会得到正确的答案
是的,您可以在应用程序中使用自定义字体
一步一步跟随那里:
Info.plist
名为UIAppFonts 的文件中。Info.plist
现在保存在您的应用程序中,您只需调用[UIFont fontWithName:@"your Custom font Name" size:20]
即可获取与您的自定义字体一起使用UILabels
在应用此字体后,如果您的字体不正确,则双击自定义字体,然后仔细查看顶部字体的名称,然后复制该字体并粘贴,在这里[UIFont fontWithName:@" here past your Custom font Name" size:20]
希望您得到正确的答案