某些字体没有出现?

时间:2011-05-09 19:36:52

标签: ios fonts

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

ArialRoundedMTBold
ChalkboardSE粗体
TrebuchetMS-粗体

相反,它们以标准字体显示。

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

5 个答案:

答案 0 :(得分:37)

如何配置自定义字体

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

UIAppFonts

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

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

Font Book

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

如何以编程方式加载字体

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

  1. 第一步是使用您认为合适的算法加密和解密字体。
  2. 将字体加载为NSData对象并反转加密。
  3. 以编程方式注册字体。
  4. 以下食谱来自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. 在Fontforge中打开字体
    2. 转到'元素' - &gt; '字体信息'并更改'姓氏'字段
    3. 转到'元素' - &gt; 'TTF姓名'并更改字段'家庭'和'首选家庭'
    4. 转到'文件' - &gt; “生成字体”并保存已编辑的字体

答案 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名称。

它甚至可以用于同一家族的不同字体变体。