我的应用程序中有一个字体名称列表,它们都以它们代表的字体显示。以下三个不起作用:
ArialRoundedMTBold
ChalkboardSE粗体
TrebuchetMS-粗体
相反,它们以标准字体显示。
为什么这些可能没有出现的任何想法?
答案 0 :(得分:37)
要使用自定义字体(iOS中未包含该字体),您必须编辑<appname>-Info.plist
文件并使用类型数组创建新的UIAppFonts
键,其中数组的每个元素都是一个String您的字体文件的名称。示例:VAGRoundedStd-Light.ttf
。您还必须将该文件添加到项目中。
注意:当您键入UIAppFonts
并按Enter键时,该键将转换为“应用程序提供的字体”。
但是,在Interface Builder(或UIFont
)中使用字体时,不使用字体的文件名,而是在应用程序字体中打开字体时显示的名称预订Mac的。对于前面的示例,它将是VAG Rounded Std Light
。
OS X比iOS消化TrueType格式更宽容,因此在极少数情况下,您可能会发现在OS X中有效但在iOS中无效的字体。如果发生这种情况,请更换字体,看看是否至少让您的流程正确。
这解决了字体许可证要求您分发加密字体的情况。
以下食谱来自Marco Arment的Loading iOS fonts dynamically。它使UIFont和UIWebView中的字体可用。可以使用相同的代码从Internet加载字体。
NSData *inData = /* your decrypted 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);
这是iOS拒绝从同一系列加载两种以上字体的情况。
以下是stackoverflow用户Evadne Wu的代码解决方法。只需将以下内容粘贴到您的app委托中(请注意它使用两个框架):
#import <CoreText/CoreText.h>
#import <MobileCoreServices/MobileCoreServices.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
CTFontManagerRegisterFontsForURLs((__bridge CFArrayRef)((^{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *resourceURL = [[NSBundle mainBundle] resourceURL];
NSArray *resourceURLs = [fileManager contentsOfDirectoryAtURL:resourceURL includingPropertiesForKeys:nil options:0 error:nil];
return [resourceURLs filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSURL *url, NSDictionary *bindings) {
CFStringRef pathExtension = (__bridge CFStringRef)[url pathExtension];
NSArray *allIdentifiers = (__bridge_transfer NSArray *)UTTypeCreateAllIdentifiersForTag(kUTTagClassFilenameExtension, pathExtension, CFSTR("public.font"));
if (![allIdentifiers count]) {
return NO;
}
CFStringRef utType = (__bridge CFStringRef)[allIdentifiers lastObject];
return (!CFStringHasPrefix(utType, CFSTR("dyn.")) && UTTypeConformsTo(utType, CFSTR("public.font")));
}]];
})()), kCTFontManagerScopeProcess, nil);
return YES;
}
以gist的形式提供。在作者博客评论:Loading 2+ fonts on iOS from the same font family。
来自pixeldock.com的另一种更具参与性的解决方法:
如果您添加同一字体系列的2个以上字体变体(例如 “正常”,“粗体”和“扩展”),只有最后两种字体变体 你添加到项目中将是可用的。
如果您发现这种情况,那么这是您的SDK版本的限制,唯一的方法是使用Fontforge等字体编辑器编辑字体系列。同样,来自pixeldock.com:
答案 1 :(得分:2)
iOS中只有subset个Mac OS字体可用。如果您设置了不可用的字体,它将显示为标准Helvetica。
答案 2 :(得分:1)
我使用的是名为Arvo的Google字体。它有以下文件:
阿尔沃-Regular.ttf 帕特 - Bold.ttf 帕特 - BoldItalic.ttf 帕特 - Italic.ttf 这些名称已添加到我的应用程序的info.plist中但由于某种原因,我的应用程序只能读取粗体,粗体和斜体字体。当我试图加载它时,它无法读取常规字体。但是,在打印出字体名称之后,Arvo-Regular在我的应用程序中被识别为Arvo。
答案 3 :(得分:0)
我有一个类似的问题,没有找到Chalkduster - 尽管IB将其列为字体并且它被列为IOS字体。我发现iPhone和iPad上的字体列表并不相同。
Chalkduster适用于iPad但不适用于iPhone。黑板可在iPad 4.x上使用,但不适用于3.x.它 可在iPhone 3.x&amp; 4.x的。
此处有更多详情:http://www.whatsyourdigitaliq.com/2011/05/11/fonts-available-in-various-versions-of-ios/
答案 4 :(得分:0)
打开Font Book应用程序。如果您自己安装了这些字体,请转到用户,查找所需的字体,并在xcode项目中使用该字体的PostScript名称。
它甚至可以用于同一家族的不同字体变体。