某些字体没有显示出来?

我在我的应用程序中有一个字体名称列表,它们都以它们所代表的字体显示。 以下三个虽然不工作:

ArialRoundedMTBold
ChalkboardSE粗体
TrebuchetMS粗体

相反,他们显示在标准的字体。

任何想法,为什么这些可能不会显示?

如何configuration自定义字体

要使用自定义字体(不包括在iOS中),您必须编辑您的<appname>-Info.plist文件,并使用types数组创build一个新的UIAppFonts键,其中数组的每个元素都是一个string,其中包含字体的名称文件。 例如: VAGRoundedStd-Light.ttf 。 您还必须将文件添加到您的项目。

UIAppFonts

注意:当您键入UIAppFonts并按下Enter时,该键将转换为“应用程序提供的字体”。

但是,在Interface Builder(或UIFont )中使用字体时,不使用字体的文件名,而是在Mac的应用程序Font Book中打开字体时显示的名称。 对于前面的例子,它将是VAG Rounded Std Light

字体书

OS X比iOS消化TrueType格式更容忍,所以在极less数情况下,您可能会发现OS X中可以使用的字体,但在iOS中不能使用。 如果发生这种情况,请更换字体以查看是否至less得到正确的处理。

如何以编程方式加载字体

这解决了字体许可要求您分发encryption字体的情况。

  1. 第一步是用你认为合适的algorithmencryption和解密字体。
  2. 加载字体作为一个NSData对象,并逆转encryption。
  3. 以编程方式注册字体。

以下配方是由Marco Arment dynamic加载iOS字体 。 它使字体在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吴代码解决方法。 只需将以下内容粘贴到您的应用程序委托(请注意,它使用两个框架):

 #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; } 

作为要点提供 。 在作者博客中评论: 在同一个字体家族的iOS上加载2+字体 。


另一个来自pixeldock.com的解决方法是:

如果您添加了相同字体系列(例如“普通”,“粗体”和“扩展”)的两种以上字体变体,则只有添加到项目中的最后两种字体变体才可用。

如果你看到这种情况发生,这是你的SDK版本的限制,唯一的出路就是用像Fontforge这样的字体编辑器来编辑字体族。 再次来自pixeldock.com :

  1. 在Fontforge中打开你的字体
  2. 转到“元素” – >“字体信息”,并更改“家庭名称”字段
  3. 转到“元素” – >“TTF名称”,并更改字段“家庭”和“首选家庭”
  4. 转到“文件” – >“生成字体”并保存您的编辑字体

iOS中只有一部分 Mac OS字体可用。 如果您设置了不可用的字体,它将显示为标准的Helvetica。

我正在使用名为Arvo的Google字体。 它有以下文件:

Arvo-Regular.ttf Arvo-Bold.ttf Arvo-BoldItalic.ttf Arvo-Italic.ttf这些名称被添加到我的应用程序的info.plist,但由于某种原因,我的应用程序只能读取粗体,粗体和斜体字体。 当我尝试加载它时,它无法读取常规字体。 但是,打印出字体名称后,Arvo-Regular在我的应用程序中被认定为Arvo。

我有一个类似的问题没有findChalkduster – 即使IB列为字体,它被列为IOS字体。 我发现iPhone和iPad上的字体列表并不完全相同。

Chalkduster适用于iPad,但不适用于iPhone。 黑板在iPad 4.x上可用,但不是3.x. 它在iPhone 3.x和4.x上可用。

更多细节在这里: http : //www.whatsyourdigitaliq.com/2011/05/11/fonts-available-in-various-versions-of-ios/

打开字体书应用程序。 如果您自己安装了字体,请转到用户,查找您需要的字体并在xcode项目中使用该字体的PostScript名称。

即使对于同一个家族的不同字体变化,它也应该可以工作。