iOS 7中的自定义字体


102

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

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


您确定在代码中使用字体时使用的字体名称正确吗?
尼克,

1
这个博客可能对您有帮助codewithchris.com/…–
Xu Yin

Answers:


277

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

  1. 您需要将.otf或.ttf中的字体复制到项目中。例如在支持文件中。
  2. 您需要编辑.plist文件。在您的plist中添加“应用程序提供的字体”键,然后在项目0中将复制的字体的确切文件名复制到带有扩展名的Supporting files中。例如:“ JosefinSansStd-Light_0.otf”
  3. 确保导入到应用程序的字体已打包到应用程序本身中。为此,选择目标,然后构建阶段,然后复制捆绑资源。如果您在那里看不到字体,请将其从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中,您可以将字体直接添加到项目中,并且它们在界面生成器中可见。修改您的代码以解决此问题,但是可以通过编程方式为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;  
    }

希望这会有所帮助,欢呼。


谢谢!我知道了!Y:这个问题是我wan't将其添加到支持文件,所以这是不加载
何塞·玛丽亚·

1
我必须使用UIAppFonts
Mike Flynn

1
我重新创建了我的应用,将整个项目从iOS7 / Xcode 5.1.1转换为一个iOS8 / Xcode 6.0项目。自定义字体直到我执行了2.step才显示。Gr8解释!
MB_iOSDeveloper 2014年

1
在Swift中获取字体名称的相同代码: let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") }
Alexander Bekert,2015年

1
用于打印所有字体名称的一些快速代码:for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) }
gimenete

24

使用自定义字体没有问题,我做到了。跟着这些步骤:

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

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

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


2
对我来说,关键是字体的标题。谢谢!
奥斯卡

20

为了迅速实现这一目标

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

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

或与UIFont.familyNames.forEach { print("fontFamily: \($0), fonts: \(UIFont.fontNames(forFamilyName: $0))") }
Daniel

5

我从没有尝试过多次就可以得到这些答案。我获得自定义字体的唯一方法是,按照接受的答案中的说明进行操作,然后在使用该字体的故事板上创建一个隐藏标签。我可以以编程方式使用字体。我知道很古怪,但是它对我有用。


1
你是完全正确的。我查看了许多教程中的所有内容,包括plist,针对项目的复选标记,构建阶段,最后找到了正确的字体系列名称,但仍然无法正常工作。然后,我按照您所说的添加了一个隐藏标签,最后它出现了。我正在使用Xcode 7.2,它一定是bug。
DrZ214

3

如果您使用的是Xcode 6,那么就很简单。只需将一个font文件夹添加到您的项目中,将您的字体添加到该文件夹​​中,就可以了。

在此处输入图片说明


7
确保也将其添加到预期目标。鬼ho的哈比人Xcode。
马特·帕金斯

3

如果以上方法都不适合您,并且您碰巧仅以编程方式使用自定义字体(即您未在任何xib中使用它),则您将需要在一个xib中的任何位置至少使用一次。

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


2

已为Swift 3更新。

let fontFamilies:[String] = UIFont.familyNames

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

0

也许是一个快速解决方案-字体已经可以工作时,它为我完成了工作,但是新的(例如Label)没有显示所需的字体:

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


0
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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.