我在我的应用中添加了两种字体供使用。
这是字体图片。目前,文件名为
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
但似乎没有任何效果。我怎样才能得到字体的确切名称。
答案 0 :(得分:82)
使用+[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)")
}
}
}
答案 1 :(得分:50)
这是步骤,如何在应用程序中添加自定义字体。
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(@"~~~~~~~~");
}
可以超越一步,建议对您的情况有帮助:
答案 2 :(得分:47)
虽然UIFont
的{{1}}方法似乎对您提供的名称相当宽容,但官方fontNamed:size:
一直是字体的内部PostScript名称。字体的PostScript名称不能包含空格,通常用连字符替换它们。我不记得了,但我相信它们也可能只限于31个字符。
确定代码中应该使用的名称非常简单。双击要在iOS设备上使用的字体,在Font Book中打开它。如果尚未安装该字体,请单击出现的示例窗口中的“安装”按钮。安装完成后,在“字体”列表中选择字体。在Font Book的菜单中,选择Preview>显示字体信息。这将显示有关字体的信息,如下图所示:
如您所见,fontName
的PostScript名称为Helvetica Neue LT Std 65 Medium
。这是你应该在代码中使用的名称。
在HelveticaNeueLTStd-Md
文件中,在应用程序的字体下,您需要使用字体本身的实际文件名,无论发生什么情况。就我而言,它是Info.plist
。
答案 3 :(得分:9)
更容易获取字体名称
Full Name
属性并将其用作字体名称它既可以在info .plist文件中使用添加扩展名,也可以在代码中使用[UIFont fontWithName:<Full Name> size:17]
答案 4 :(得分: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);
}
}
答案 5 :(得分: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
答案 6 :(得分:3)
其他答案没有错。事实上,iPatel的先决条件仍在继续适用。
UIFont.familyNames().sort().forEach({ (familyName) in
debugPrint(UIFont.fontNamesForFamilyName(familyName))
})
如果您已在系统上安装了字体,您还可以简单地将字体添加到故事板中的UI元素。
注意强>
但是,我注意到在某些情况下出现了一个错误,即在将一个字体正确地添加到故事板中的项目,info.plist和UI元素后,它们仍然无法正确反映您所需的更改。在某些情况下,切换设置将有助于故事板同步它的基础xml。在其他情况下,您可能只需要在代码中更新自定义字体的大小即可使更改生效。我发现Swift中最简单的方法是:
@IBOutlet weak var startMessage: UILabel!
startMessage.font = UIFont(name: startMessage.font.familyName, size: 31.0)
假设自定义字体已在故事板中设置,只是更新代码中的大小。此解决方法将确保如果满足所有其他先决条件,您实际上会看到正确的自定义字体。它还消除了实际知道基础字体名称的需要(尽管如果需要,上面的初始Swift代码将为您提供名称)。
答案 7 :(得分:2)
Swift版本:
static func printAllFontNames() {
for familyname in UIFont.familyNames() {
for fname in UIFont.fontNamesForFamilyName(familyname) {
print(fname)
}
}
}
答案 8 :(得分:1)
Swift 3版本:
UIFont.familyNames.sorted().forEach({ (familyName) in
print(UIFont.fontNames(forFamilyName: familyName))
})
答案 9 :(得分:0)
创建一个新的单视图应用程序
在您的应用中创建一个名为“字体”的组,放入字体文件(如果需要,请勾选复制文件)。
在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))
}
}
}
(抱歉,这不是重复的,我为错误的问题添加了错误的答案)