【问题标题】:Certain fonts not showing up?某些字体不显示?
【发布时间】:2011-08-21 22:42:53
【问题描述】:

我的应用中有一个字体名称列表,它们都以它们所代表的字体显示。但是以下三个不起作用:

ArialRoundedMTBold
黑板SE-Bold
TrebuchetMS-粗体

它们以标准字体显示。

任何想法为什么这些可能没有出现?

【问题讨论】:

  • 我遇到了类似的问题,Chalkduster 无法正常工作。我试过在 IB 中选择它。我尝试使用我能想到的每个名称变体在代码中设置字体名称。该字体在我的 Mac 或手机上都没有使用。我尝试转储字体名称列表,但 Chalkduster 没有出现。但是,它在我下载的“字体”应用程序中正确显示。这让我很困惑。
  • 我对此进行了更多调查。 iPhone 和 iPad 上的字体列表并不完全相同。 Chalkduster 适用于 iPad,但不适用于 iPhone。黑板适用于 iPhone 和 iPad 4.x 上的所有 iOS 版本,但不适用于 3.x。详情在这里:whatsyourdigitaliq.com/2011/05/11/…

标签: ios fonts


【解决方案1】:

如何配置自定义字体

要使用自定义字体(iOS 中不包含该字体),您必须编辑您的 <appname>-Info.plist 文件并创建一个新的 UIAppFonts 类型为数组的键,其中数组的每个元素都是一个带有您的名称的字符串字体文件。示例:VAGRoundedStd-Light.ttf。您还必须将文件添加到您的项目中。

注意:当您输入UIAppFonts 并回车时,键会转换为“应用程序提供的字体”。

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

OS X 比 iOS 消化 TrueType 格式更宽容,所以在极少数情况下,您可能会发现在 OS X 中有效但在 iOS 中无效的字体。如果发生这种情况,请更换字体以查看是否至少您的流程正确。

如何以编程方式加载字体

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

  1. 第一步是使用您认为合适的任何算法对字体进行加密和解密。
  2. 将字体加载为 NSData 对象并反转加密。
  3. 以编程方式注册字体。

以下食谱来自 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 的代码解决方法。只需在您的应用程序委托中添加以下内容(注意它使用两个框架):

#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 种相同字体系列的字体变体(例如 “Normal”、“Bold”和“Extended”),只有最后两种字体变体 您添加到项目中将可用。

如果您看到这种情况,这是您的 SDK 版本的限制,唯一的解决方法是使用 Fontforge 等字体编辑器编辑字体系列。再次,来自pixeldock.com

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

【讨论】:

  • 我希望我能 +100.. 非常感谢 Jano.. :)
  • 但是,当您在 Interface Builder(或使用 UIFont)中使用字体时,您不会使用字体的文件名,而是在应用程序 Font Book 中打开字体时出现的名称你的 Mac。对于前面的示例,它将是 VAG Rounded Std Light。 OS X 比 iOS 消化 TrueType 格式更宽容,所以在极少数情况下,您可能会发现在 OS X 中有效但在 iOS 中无效的字体。如果发生这种情况,请更换字体以查看至少您是否正确处理了该过程。救了我的命 !!!!!!!!谢谢
  • 你刚刚阻止我把我的 MacBook 折成两半。谢谢!
  • 我收到错误加载字体失败:操作无法完成。 (com.apple.coretext 错误 105 - 无法注册 CGFont '')
  • +infinity -- 我确实花了一整天的时间试图弄清楚这一点。你是绝对的救星!!!非常感谢。
【解决方案2】:

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

【讨论】:

  • 这些字体是可用的。它们显示在我拥有的 UIPickerView 内,但没有显示在它们应该显示的其他区域,尽管被引用为相同的字体名称。就是那些字体。
  • @Andrew:“尽管被引用为相同的字体名称”是否意味着如果您 NSLog() 两个有问题的控件的 UIFonts,它们都打印出相同的字体名称?跨度>
  • 它们都来自同一个数组。其中之一以 font-family: "Helvetica" 的形式返回;字体粗细:正常; font-style: normal;,一个返回为font-family: "Chalkboard SE"; font-weight: bold; font-style: normal;
【解决方案3】:

我使用的是一种名为 Arvo 的 Google 字体。它有以下文件:

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

【讨论】:

    【解决方案4】:

    我有一个类似的问题,没有找到 Chalkduster - 尽管 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/

    【讨论】:

    • 有谁知道是否允许在 iPhone 应用程序中包含 Apple 字体(如 Chalkduster)。
    【解决方案5】:

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

    它甚至应该适用于同一家族的不同字体变体。

    【讨论】:

    • 无法在 UIwebView 中使用 javascript。我收到错误 : FT_Open_Face failed: error 2. 我想使用 Shruti.ttf
    猜你喜欢
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 2012-08-20
    相关资源
    最近更新 更多