向iOS应用程序添加自定义字体以查找其真实姓名

向iOS应用程序添加自定义字体以查找其真实姓名,ios,objective-c,cocoa-touch,Ios,Objective C,Cocoa Touch,我有两种字体可以添加到我的应用程序中使用 这是字体图像。目前,这些文件的名称为 name.font = [UIFont fontWithName:@"Helvetica Neue LT Pro-Medium" size:10]; headline.font = [UIFont fontWithName:@"Helvetica Neue LT Pro-Light" size:8]; 在plist文件的字体可用选项中输入相同的名称 我还尝试添加文件名,如 HelveticaNeue

我有两种字体可以添加到我的应用程序中使用

这是字体图像。目前,这些文件的名称为

name.font       = [UIFont fontWithName:@"Helvetica Neue LT Pro-Medium" size:10];
headline.font   = [UIFont fontWithName:@"Helvetica Neue LT Pro-Light" size:8];
在plist文件的
字体可用选项中输入相同的名称

我还尝试添加文件名,如

HelveticaNeueLTPro-Lt
HelveticaNeueLTPro-Md
但似乎什么都不管用。我怎样才能得到字体的确切名称


这是如何在应用程序中添加自定义字体的步骤

1-在应用程序中添加
.TTF
字体
2-修改
application-info.plist文件

3-将键“应用程序提供的字体”添加到新行
4-并将每个
.TTF
文件(字体)添加到每行

也可以阅读和学习教程来提高你的知识

有关更多信息:

但在将字体添加到应用程序后,有时可能是字体名称不是文件名的名称,因此您需要应用/写入字体的真实名称,因此请检查@nsgood的回答

以下是从系统中查找所有字体的代码:

for(NSString *fontfamilyname in [UIFont familyNames])
{
    NSLog(@"Family:'%@'",fontfamilyname);
    for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
    {
        NSLog(@"\tfont:'%@'",fontName);
    }
    NSLog(@"~~~~~~~~");
}

可能是上述步骤,建议对您的情况有帮助:

使用
+[UIFont familyNames]
列出系统已知的所有字体系列名称。对于每个系列名称,您可以使用
+[UIFont-fontNamesForFamilyName::
列出系统已知的所有字体名称。试着打印出来,看看系统需要什么名称。示例代码:

static void dumpAllFonts() {
    for (NSString *familyName in [UIFont familyNames]) {
        for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
            NSLog(@"%@", fontName);
        }
    }
}
把它放到你的应用程序中,打电话,看看你能得到什么。如果在输出中看到适合您字体的名称,请使用它。否则,可能您没有正确地将字体添加到应用程序中

在swift 4.2+中,使用以下代码:

func dumpAllFonts() {
        for familyName in UIFont.familyNames {
            for fontName in UIFont.fontNames(forFamilyName: familyName) {
                print("\(fontName)")
            }
        }
    }

获取字体名称的更简单方法

  • 右键单击.ttf/.otf文件并选择“获取信息”
  • 阅读
    全名
    属性并将其用作字体名称

  • 它在info.plist文件(添加扩展名)和带有
    [UIFont-fontWithName:size:17]
    的代码中都有效,而
    UIFont
    fontname:size:
    方法似乎对您提供的名称相当宽容,官方的
    fontName
    始终是字体的内部PostScript名称。字体的PostScript名称不能包含空格,通常用连字符替换。我一时记不起来了,但我相信它们也可以限制在31个字符以内

    确定代码中应该使用的名称非常简单。双击要在iOS设备上使用的字体,在字体手册中打开它。如果尚未安装字体,请单击出现的示例窗口中的安装按钮。安装后,在字体列表中选择字体。在字体手册的菜单中,选择预览>显示字体信息。这将显示有关字体的信息,如下图所示:

    如您所见,
    Helvetica Neue LT Std 65 Medium
    的PostScript名称为
    Helvetica Neue LT Std Md
    。这是您应该在代码中使用的名称


    Info.plist
    文件中,在应用程序的字体下,您需要使用字体本身的实际文件名,不管它是什么。在我的例子中,它是
    HelveticaNeueLTStd-Md.otf

    只需记录您想要的字体:

    NSLog(@“%@,[UIFont fontNamesForFamilyName:@“美国打字机”)

    然后得到数组:

    (
      "AmericanTypewriter-CondensedLight",
      "AmericanTypewriter-Light",
      "AmericanTypewriter-Bold",
      AmericanTypewriter,
      "AmericanTypewriter-CondensedBold",
      "AmericanTypewriter-Condensed"
    )
    
    在任何字体名称中使用所需的任何代码AmericanTypewriter Bold作为[UIFont fontWithName:@“AmericanTypewriter Bold”大小:12.0]

    此外,您还可以按字体系列对所有应用的字体进行分组

    for (NSString* family in [UIFont familyNames])
    {
        NSLog(@"%@", family);
    
        for (NSString* name in [UIFont fontNamesForFamilyName: family])
        {
            NSLog(@"  %@", name);
        }
    }
    

    我写了一些代码,只打印出你想要的字体名称,而不只是打印出所有的字体

    - (NSString *)realNameOfFont:(NSString *)fullFontName {
        NSString *fontName = [[fullFontName componentsSeparatedByString:@"."] firstObject];
        NSString *ext = [fullFontName pathExtension];
    
        NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fontName ofType:ext]];
        if (data == nil) {
            NSLog(@"Failed to load font. Data at path %@ is null", fullFontName);
            return nil;
        }
        CFErrorRef errorRef;
        CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)data);
        CGFontRef font = CGFontCreateWithDataProvider(provider);
        NSString *realFontName = (__bridge NSString *)CGFontCopyPostScriptName(font);
        if (!CTFontManagerRegisterGraphicsFont(font, &errorRef)) {
            NSError *error = (__bridge NSError *)errorRef;
            if (error.code != kCTFontManagerErrorAlreadyRegistered) {
                NSLog(@"Failed to load font: %@", error);
            }
        }
        NSLog(@"Real font name: %@", realFontName);
        CFRelease(font);
        CFRelease(provider);
        return realFontName;
    }
    
    例如:

     NSArray *fonts = @[@"bg_en_AmaticSC-Bold111.otf", @"bg_en_segoescb_0.ttf", @"bg_en_UTM Cookies_2.ttf", @"bg_en_VSCOProximaExtrabold_0.otf"];
    for (NSString *fontFullName in fonts) {
        [self realNameOfFont:fontFullName];
    }
    
    结果:

    Failed to load font. Data at path bg_en_AmaticSC-Bold111.otf is null
    Real font name: SegoeScript-Bold
    Real font name: UTM-Cookies
    Real font name: ProximaNova-Extrabld
    

    其他答案没有错。事实上,iPatel的先决条件仍然适用

    在Swift 2.2+中,显示姓氏的要求很简单: 如果已经在系统上安装了字体,还可以简单地将字体添加到情节提要中的UI元素中

    注意

    但是,我注意到在某些情况下存在一个缺陷,即在将字体正确添加到项目、info.plist和脚本中的UI元素后,它们仍然不能正确反映所需的更改。在某些情况下,切换设置将有助于故事板同步其底层xml。在其他情况下,您可能需要在代码中简单地更新自定义字体的大小,以使更改生效。我发现Swift中最简单的方法是:

    @IBOutlet weak var startMessage: UILabel!
    startMessage.font = UIFont(name: startMessage.font.familyName, size: 31.0)
    
    假设脚本中已经设置了自定义字体,只需在代码中更新大小。此解决方法将确保如果满足所有其他先决条件,您实际上可以看到正确的自定义字体。它还消除了实际了解基础字体名称的需要(尽管如果需要,上面的初始Swift代码将为您提供名称)。

    Swift版本:

    static func printAllFontNames() {
        for familyname in UIFont.familyNames() {
            for fname in UIFont.fontNamesForFamilyName(familyname) {
                print(fname)
            }
        }
    }
    
    Swift 3版本:

    UIFont.familyNames.sorted().forEach({ (familyName) in
                print(UIFont.fontNames(forFamilyName: familyName))
            })
    
    swift 3的更新

    for familyname in UIFont.familyNames {
                for fname in UIFont.fontNames(forFamilyName: familyname) {
                    print(fname)
                }
            }
    

    创建新的单视图应用程序

    在应用程序中创建一个名为“字体”的组,插入字体文件(如果需要,请勾选“复制文件”)

    在info.plist中,添加“应用程序提供的字体”,为每个字体添加每个项目,例如,项目0:AlexBrush-Regular.ttf,项目1:Fipps-Regular.otf

    或直接编辑info.plist:

    <key>UIAppFonts</key>
    <array>
        <string>AlexBrush-Regular.ttf</string>
        <string>Fipps-Regular.otf</string>
    </array>
    

    (很抱歉,这不是重复的,我在错误的问题上添加了错误的答案)

    是否确实要将字体添加到Xcode?这不是你的iOS应用吗?试试这个@H2CO3我的意思是说我的应用:)@NaCl是的,我知道所有这些步骤。我只是不知道应该在plist键和UIFont NamedCheck中放置什么名称:这两个方法都不是公共API的一部分。使用任何一个都会使你的应用程序无法通过审核。@“FontName”不带扩展名,例如UILabel*label;label.font=[UIFont fontWithName:@“MyriadPro Light”大小:36.0]@罗布,我不明白这是怎么回事
    <key>UIAppFonts</key>
    <array>
        <string>AlexBrush-Regular.ttf</string>
        <string>Fipps-Regular.otf</string>
    </array>
    
    //
    //  ViewController.swift
    //  FontsApp
    //
    //  Created by Gary Davies on 28/3/19.
    //  Copyright © 2019 Gary Davies. All rights reserved.
    //
    
    import UIKit
    
    class ViewController: UIViewController {
    
        var fontFamilyNames: [String] = []
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            fontNames()
        }
    
        func fontNames() {
            getFontNames()
            sortFontNames()
            printFontName()
        }
    
        func getFontNames() {
            fontFamilyNames.removeAll()
            for name in UIFont.familyNames {
                fontFamilyNames.append(name)
            }
        }
    
        func sortFontNames() {
            let sorted = fontFamilyNames.sorted { $0.localizedCaseInsensitiveCompare($1) == ComparisonResult.orderedAscending }
            fontFamilyNames.removeAll()
            for name in sorted {
                fontFamilyNames.append(name)
            }
        }
    
        func printFontName() {
            for name in fontFamilyNames {
                print(name, "=>", UIFont.fontNames(forFamilyName: name))
            }
        }
    }