iOS 7 中的自定义字体

Posted

技术标签:

【中文标题】iOS 7 中的自定义字体【英文标题】:Custom fonts in iOS 7 【发布时间】:2014-03-11 08:38:47 【问题描述】:

我正在开发一款游戏,我想在我的应用中使用自定义字体。如果这很重要,我正在使用 SpriteKit。我试过使用这个https://github.com/deni2s/IBCustomFonts,但我无法让它使用这个字体http://www.fontspace.com/freaky-fonts/emulogic

我尝试了各种方法,并在应用程序的 info.plist 上注册了字体...有人知道发生了什么吗?

【问题讨论】:

在代码中使用字体时,您确定使用了正确的字体名称吗? 这个博客可能对你有帮助codewithchris.com/… 【参考方案1】:

首先我假设 SpriteKit 没有任何区别。

    您需要将 .otf 或 .ttf 格式的字体复制到您的项目中。例如在支持文件中。 您需要编辑 .plist 文件。将 “应用程序提供的字体” 键添加到您的 plist 中,并在 Item 0 中将您复制的字体的确切文件名复制到带有扩展名的支持文件中。例如:“JosefinSansStd-Light_0.otf” 确保您导入应用程序的字体被打包到应用程序本身。选择您的Target,然后选择Build Phases,然后选择Copy Bundle Resources。如果您没有在其中看到您的字体,请将其从 Supporting Files 中拖动。

最后,您希望在应用启动时列出所有字体,以便查看您的字体的可用名称。您将使用这段小代码来做到这一点:

NSArray *fontFamilies = [UIFont familyNames];
for (int i = 0; i < [fontFamilies count]; i++)

    NSString *fontFamily = [fontFamilies objectAtIndex:i];
    NSArray *fontNames = [UIFont fontNamesForFamilyName:[fontFamilies objectAtIndex:i]];
    NSLog (@"%@: %@", fontFamily, fontNames);

在打印结果中搜索您的字体,例如,我会搜索“Josefin”,我会看到实际的字体名称是“JosefinSansStd-Light”。之后,您只需要通过以下方式使用该字体:

UIFont *customFont = [UIFont fontWithName:@"JosefinSansStd-Light" size:20];

ios8 中,您 add your fonts 直接进入项目,它们在界面构建器中可见。 修改您的代码以解决此问题,但以编程方式为 iOS7 设置字体并在 xCode6 界面构建器中选择它。 PS。 xCode6 中的界面生成器为您提供正确的字体名称,您可以将其复制粘贴到下面的代码中。

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

 if(SYSTEM_VERSION_LESS_THAN(@"8.0"))
    
        UIFont *customFont = [UIFont fontWithName:@"OpenSans-Light" size:32];
        self.registerLabel.font = customFont;  
    

希望这会有所帮助,干杯。

【讨论】:

谢谢!我得到了它!问题是我不想将它添加到支持文件中,所以它没有加载:P 我不得不使用UIAppFonts的plist键 我重新创建了我的应用程序,整个项目从 iOS7/Xcode 5.1.1 到 iOS8/Xcode 6.0 项目。在我执行 2.step 之前,自定义字体没有显示。 Gr8解释! 在 Swift 中获取字体名称的代码相同:let fontFamilies = UIFont.familyNames() for familyName in fontFamilies let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") 一些用于打印所有字体名称的快速代码:for name in UIFont.familyNames() debugPrint(UIFont.fontNamesForFamilyName(name)) 【参考方案2】:

使用自定义字体没问题,我做到了。请按以下步骤操作:

    在 info.plist 中注册字体,添加“应用程序提供的字体”条目。输入字体文件名,而不是字体名。比如 font.ttf(我想你已经这样做了) 在项目导航器上进入你的项目,点击项目名称并进入“构建阶段”然后在“复制捆绑资源”中往下看,到底部,有很多文件并搜索“+ “ 标志。将打开一个弹出窗口,其中包含您的项目文件。搜索您的字体文件并将其添加到包中。 最后检查字体名称。在代码中使用它时,必须使用字体名称,而不是文件名。要知道字体名称,请在 Finder 中双击字体文件,然后会打开一个显示字体的窗口。检查该窗口标题,这是您必须使用的字体的名称。

建议,将该名称作为宏添加到您的 ..Prefix.pch 文件中。如果您必须多次使用该字体,在您的项目中使用它会更容易。

我认为您遇到的问题是您正确注册了字体,但未将其复制到应用程序包中。因此,当应用程序执行时,它找不到字体。这就是为什么第 2 步很重要的原因。第一次我花了很多时间试图弄清楚:)

【讨论】:

对我来说关键是字体的标题。谢谢!【参考方案3】:

如果您使用的是 Xcode 6,那么它就非常简单。只需将font 文件夹添加到您的项目中,将您的字体添加到文件夹中,您就可以开始了。

【讨论】:

确保您也将其添加到您的预期目标中。鬼鬼祟祟的霍比特人 Xcode。【参考方案4】:

快速实现这一目标

如果您想在应用启动时列出所有字体,只是为了查看字体的可用名称。你可以用这段代码做到这一点:

    UIFont.familyNames.forEach 
        print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))")
    

【讨论】:

UIFont.familyNames.forEach print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") 【参考方案5】:

也许是一个快速修复 - 当字体已经工作时,这为我做了,但是一个新的,例如标签未显示所需的字体:

清理、深度清理并清空派生数据文件夹。

【讨论】:

【参考方案6】:

经过多次尝试,我始终无法得到这些工作的答案。我曾经在其中获得自定义字体以遵循已接受答案中的说明的唯一方法,然后在使用该字体的故事板中创建一个隐藏标签。我可以以编程方式使用字体。我知道这很奇怪,但它对我有用。

【讨论】:

你是对的。我查看了许多教程中的所有内容,包括 plist、目标项目的复选标记、构建阶段,最后找到了正确的字体系列名称,但它仍然无法正常工作。然后我按照你说的添加了一个隐藏标签,最后它出现了。我正在使用 Xcode 7.2,它一定是一个错误。【参考方案7】:

如果上述方法都不适合您,并且您碰巧仅“以编程方式”使用自定义字体(即您没有在任何 xib 中使用它),那么您将需要至少在某个地方使用它一次xib,任何地方。

(PS Stuart Clark - 已经回答了这个问题,所以请不要感谢我。但是,我决定重新措辞并将其作为单独的答案发布,因为我错过了他的答案,当我读到它时我并不清楚. 我在 xib 中测试自定义字体时偶然发现了这个解决方案,我看到它在其他地方以编程方式工作,但是当我从 xib 中删除字体时,它以编程方式停止工作。)

【讨论】:

【参考方案8】:

为 Swift 3 更新。

let fontFamilies:[String] = UIFont.familyNames

for fontFamily: String in fontFamilies 
    let fontNames: [String] = UIFont.fontNames(forFamilyName: fontFamily)
    print("\(fontFamily)  \(fontNames)");

【讨论】:

【参考方案9】:
please try below code.
@end
@implementation UILabel (CustomFont)
-(void)setFontName:(NSString *)value
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];

@end
@implementation UITextField (CustomFont)
-(void)setFontName:(NSString *)value
CGFloat newsize = (self.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self setFont:[UIFont fontWithName:self.font.fontName size:newsize]];

@end
@implementation UIButton (CustomFont)
-(void)setFontName:(NSString *)value
CGFloat newsize = (self.titleLabel.font.pointSize * [UIScreen mainScreen].bounds.size.width)/320;
[self.titleLabel setFont:[UIFont fontWithName:self.titleLabel.font.fontName size:newsize]];

@end
@end

@interface UILabel (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UITextField (CustomFont)
-(void)setFontName:(NSString *)value;
@end
@interface UIButton (CustomFont)
-(void)setFontName:(NSString *)value;
@end

【讨论】:

以上是关于iOS 7 中的自定义字体的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin 表单:UWP 和 Windows 8.1 中的自定义字体

如何在iOS7中使用具有动态文本大小的自定义字体

如何在iOS中将具有特定大小的自定义字体设置为Web View?

Xcode 6 大小类中的自定义字体大小无法与自定义字体一起正常工作

Xcode Playground 中的自定义字体

Interface Builder 中的自定义字体