39

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

这是字体图像。目前这些文件被命名为

name.font       = [UIFont fontWithName:@"Helvetica Neue LT Pro-Medium" size:10];
headline.font   = [UIFont fontWithName:@"Helvetica Neue LT Pro-Light" size:8];

把相同的名字放在Font Avaliable option in plist file.

我也尝试过添加文件名,如

HelveticaNeueLTPro-Lt
HelveticaNeueLTPro-Md

但似乎没有任何效果。我怎样才能得到字体的确切名称。

在此处输入图像描述

4

11 回答 11

85

用于+[UIFont familyNames]列出系统已知的所有字体系列名称。对于每个系列名称,您可以使用+[UIFont fontNamesForFamilyName:]列出系统已知的所有字体名称。尝试将它们打印出来以查看系统期望的名称。示例代码:

static void dumpAllFonts() {
    for (NSString *familyName in [UIFont familyNames]) {
        for (NSString *fontName in [UIFont fontNamesForFamilyName:familyName]) {
            NSLog(@"%@", fontName);
        }
    }
}

把它放在你的应用程序中,调用它,看看你得到了什么。如果您在输出中看到适合您字体的名称,请使用它。否则,您可能没有正确地将字体添加到您的应用程序中。

在斯威夫特:

func dumpAllFonts() {
    for familyName in UIFont.familyNames {
        for fontName in UIFont.fontNames(forFamilyName: familyName) {
            print(fontName)
        }
    }
}
于 2013-04-13T06:49:35.827 回答
51

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

1 - 在您的应用程序中添加.TTF字体
2 - 修改application-info.plist file.
3 - 将“应用程序提供的字体”键添加到新行
4 - 并将每个.TTF文件(字体)添加到每一行。

另请阅读教程和教程以提高您的知识。

了解更多信息 :

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

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

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

可能高于步骤,建议对您的情况有帮助:

于 2013-04-13T06:48:06.503 回答
51

虽然看起来UIFont'fontNamed:size:方法对您提供的名称相当宽容,但官方fontName一直是字体的内部 PostScript 名称。字体的 PostScript 名称不能包含空格,通常用连字符代替。我不记得了,但我相信它们也可能被限制为 31 个字符。

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

在此处输入图像描述

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

在您的Info.plist文件中,在应用程序的字体下,您需要使用字体本身的实际文件名,无论发生什么。在我的情况下,它是HelveticaNeueLTStd-Md.otf.

于 2013-04-13T07:25:14.423 回答
9

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

  1. 右键单击您的 .ttf/.otf 文件并选择“获取信息”
  2. 读取Full Name属性并将其用作字体的名称

它适用于 info .plist 文件(添加扩展名)和代码中[UIFont fontWithName:<Full Name> size:17]

于 2013-04-13T07:21:08.697 回答
3

只需 NSLog 想要得到的字体:

NSLog(@" %@", [UIFont fontNamesForFamilyName:@"American Typewriter"]);

你得到数组:

(
  "AmericanTypewriter-CondensedLight",
  "AmericanTypewriter-Light",
  "AmericanTypewriter-Bold",
  AmericanTypewriter,
  "AmericanTypewriter-CondensedBold",
  "AmericanTypewriter-Condensed"
)

在代码中使用您需要的任何字体名称AmericanTypewriter-Bold作为[UIFont fontWithName:@"AmericanTypewriter-Bold" size:12.0]

您还可以获得按字体系列分组的所有应用字体

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

    for (NSString* name in [UIFont fontNamesForFamilyName: family])
    {
        NSLog(@"  %@", name);
    }
}
于 2013-08-16T09:22:32.077 回答
3

我编写了一些代码来仅打印出您想要的字体名称,而不仅仅是打印出所有字体。

- (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
于 2015-08-12T04:14:15.907 回答
3

斯威夫特版本:

static func printAllFontNames() {
    for familyname in UIFont.familyNames() {
        for fname in UIFont.fontNamesForFamilyName(familyname) {
            print(fname)
        }
    }
}
于 2017-01-05T15:31:10.277 回答
3

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

在 Swift 2.2+ 中,显示姓氏的调用很简单:

  UIFont.familyNames().sort().forEach({ (familyName) in
            debugPrint(UIFont.fontNamesForFamilyName(familyName))
        })

如果您已经在系统上安装了字体,您也可以简单地将字体添加到情节提要中的 UI 元素中。

笔记

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

@IBOutlet weak var startMessage: UILabel!
startMessage.font = UIFont(name: startMessage.font.familyName, size: 31.0)

假设自定义字体已经在 Storyboard 中设置,并简单地更新代码中的大小。此解决方法将确保如果满足所有其他先决条件,您实际上会看到正确的自定义字体。它还消除了实际知道底层字体名称的需要(尽管如果需要,上面的初始 Swift 代码将为您提供名称)。

于 2016-05-04T01:51:18.880 回答
1

Swift 3 的更新

for familyname in UIFont.familyNames {
            for fname in UIFont.fontNames(forFamilyName: familyname) {
                print(fname)
            }
        }
于 2017-05-08T14:33:08.937 回答
1

斯威夫特 3 版本:

UIFont.familyNames.sorted().forEach({ (familyName) in
            print(UIFont.fontNames(forFamilyName: familyName))
        })
于 2017-04-06T17:43:58.277 回答
0

创建一个新的单一视图应用程序

在您的应用程序中创建一个名为 Fonts 的组,放入您的字体文件(如果需要,勾选复制文件)。

在 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>

将此 swift 5 代码剪切并粘贴到 ViewController.swift 中,在模拟器中运行,使用您的字体名称在控制台日志中添加过滤器

//
//  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))
        }
    }
}

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

于 2019-03-28T04:11:38.853 回答