添加自定义的字体,iOS应用发现他们的真实姓名(Adding custom fonts to iOS

2019-08-22 16:16发布

我有两个字体,在我的应用程序添加使用。

下面是字体图像。 目前,该文件被命名为

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

但似乎没有任何工作。 我怎样才能获得字体的确切名称。

Answer 1:

使用+[UIFont familyNames]列出所有已知的系统字体系列名称。 对于每一个家庭的名字,然后你可以使用+[UIFont fontNamesForFamilyName:]列出所有已知系统中的字体名称。 尝试打印那些出去看系统期望什么名字。 示例代码:

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

将在您的应用程序,调用它,看看你会得到什么。 如果你看起来适合您的字体输出看到的一个名字,使用它。 否则,也许你没有正确添加字体到您的应用程序。

在迅速4.2+如下使用代码:

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


Answer 2:

这是对步,如何在应用中添加自定义字体。

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(@"~~~~~~~~");
}

可能是上面的步骤,并建议你的情况有所帮助:



Answer 3:

虽然看起来UIFontfontNamed:size:方法是相当宽容与您提供的名称,官方fontName一直是字体的内部PostScript名。 字体的Postscript名称中不能包含空格,通常他们有一个连字符替换。 我不记得随便,但我相信他们也被限制为31个字符。

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

正如你所看到的,的PostScript名称Helvetica Neue LT Std 65 MediumHelveticaNeueLTStd-Md 。 这是你应该在代码中使用的名称。

在你Info.plist文件,下应用程序的字体,你需要使用的字体本身,不管这恰好是实际的文件名。 就我而言,这是HelveticaNeueLTStd-Md.otf



Answer 4:

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

  1. 您的.ttf /杂项文件文件上单击右键,选择“获取信息”
  2. 阅读Full Name属性和使用,作为字体的名称

它的工作原理都在信息的.plist文件( 添加扩展名 ),在与代码[UIFont fontWithName:<Full Name> size:17]



Answer 5:

刚刚的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);
    }
}


Answer 6:

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

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


Answer 7:

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

在斯威夫特2.2+,以显示姓氏通话很简单:

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

如果您已经安装在系统上的字体,你也可以简单地将字体添加到故事板的UI元素。

注意

然而,我注意到在某些情况下,后一个故事板中正确添加字体到项目的info.plist,和UI元素,他们仍然不正确反映您所期望的一个bug。 在某些情况下,切换设置将有助于故事板将其同步的基础XML。 在其他情况下,您可能需要只需在代码更新您的自定义字体的大小,以使更改生效。 我发现在斯威夫特最简单的方法是:

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

即假设自定义字体在故事板已经设置,只需更新大小码。 此解决办法将确保如果所有其他先决条件,你真正看到正确的自定义字体。 它也消除了需要真正了解潜在的字体名称(虽然如果需要高于初始雨燕代码会给你的名字)。



Answer 8:

斯威夫特版本:

static func printAllFontNames() {
    for familyname in UIFont.familyNames() {
        for fname in UIFont.fontNamesForFamilyName(familyname) {
            print(fname)
        }
    }
}


Answer 9:

斯威夫特3版本:

UIFont.familyNames.sorted().forEach({ (familyName) in
            print(UIFont.fontNames(forFamilyName: familyName))
        })


Answer 10:

更新迅速3

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


Answer 11:

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

创建您的应用程序命名的字体组,(如果需要的话打勾拷贝文件)拖放在您的字体文件。

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

剪切并粘贴此快捷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))
        }
    }
}

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



文章来源: Adding custom fonts to iOS app finding their real names