iOS 7中的自定义字体

102

你确定在代码中使用字体时使用了正确的名称吗? - Nick
1
这篇博客可能对您有所帮助:http://codewithchris.com/common-mistakes-with-adding-custom-fonts-to-your-ios-app/ - Xu Yin
9个回答

279

首先,我假设SpriteKit不会有任何影响。

  1. 将您的字体文件(.otf或.ttf)复制到项目中。例如,放在Supporting Files文件夹中。
  2. 需要编辑.plist文件。将"Fonts provided by application"键添加到您的plist文件中,并在Item 0中复制您复制到Supporting Files文件夹中带有扩展名的字体文件的确切文件名。例如:"JosefinSansStd-Light_0.otf"
  3. 确保您导入到应用程序中的字体已经被打包到应用程序中。方法是选择您的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];

iOS 8中,您可以直接将字体添加到项目中,并在界面构建器中查看它们。 但是,请修改您的代码以适应此并在iOS 7上通过编程方式设置字体,在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 - José María
1
我必须使用 UIAppFonts 的 plist 键。 - Mike Flynn
1
我重新创建了我的应用程序,将整个项目从iOS7 / Xcode 5.1.1重建为iOS8 / Xcode 6.0项目。在执行第二步之前,自定义字体未显示。解释非常好! - MB_iOSDeveloper
1
在Swift中获取字体名称的相同代码:let fontFamilies = UIFont.familyNames() for familyName in fontFamilies { let fontNames = UIFont.fontNamesForFamilyName(familyName as String) println("\(familyName): \(fontNames)") } - Alexander Bekert
1
一些用于打印所有字体名称的 Swift 代码: for name in UIFont.familyNames() { debugPrint(UIFont.fontNamesForFamilyName(name)) } - gimenete
显示剩余7条评论

24

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

  1. 在info.plist文件中注册字体,添加“应用提供的字体”条目。填写字体文件名,而不是字体名称。例如:font.ttf(我认为您已经做到了这一点)。
  2. 进入项目导航器中的项目,在“Build Phases”选项中找到“Copy Bundle Resources”,往下滑动,找到许多文件,然后查找“+”符号。弹出一个窗口显示你的项目文件,搜索你的字体文件并将其添加到bundle中。
  3. 最后检查字体名称。在代码中使用字体时,必须使用字体名称,而不是文件名。要知道字体名称,请在Finder中双击字体文件,会打开一个窗口显示字体。请检查该窗口标题,这就是您要使用的字体名称。

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

我认为您遇到的问题是正确注册了字体,但没有将其复制到应用程序bundle中。因此,当应用程序执行时,无法找到字体。这就是为什么步骤2很重要。第一次我也花费了很多时间才找出来 :)


2
关键是字体的标题。谢谢! - Oscar

20

要在Swift中实现这一点:

如果您想在应用程序启动时列出所有字体,以查看可用字体名称。 您可以使用以下代码片段来实现:

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

请返回已翻译的文本:或者使用以下代码片段:UIFont.familyNames.forEach { print("字体族:($0),字体:(UIFont.fontNames(forFamilyName: $0))") } - Daniel

5

我多次尝试都无法让这些答案得到解决。唯一的方法是按照被接受的答案中的指示创建一个带有字体的隐藏标签,然后在故事板中使用该标签。然后我可以通过编程使用该字体。虽然很奇怪和不专业,但这对我有效。


1
你说得非常正确。我在许多教程中查看了所有内容,包括 plist、为项目勾选的检查标记、构建阶段,最终找到了正确的字体系列名称,但它仍然无法工作。然后按照你所说添加了一个隐藏标签,最终它出现了。我使用的是 Xcode 7.2,这一定是一个错误。 - DrZ214

3
如果您使用的是Xcode 6,那么很简单。只需将一个font文件夹添加到项目中,将字体添加到文件夹中即可。无需其他操作。

enter image description here


7
请确保将其添加到您的预定目标中,这个狡猾的Xcode霍比特人。 - Matt Parkins

3
如果以上方法都对你没有用,而且你只在代码中使用自定义字体(即没有在任何xib中使用过),那么你需要在任一xib的任意一个地方使用它至少一次。
(注: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
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

0
也许有一个快速解决办法 - 当字体已经起作用,但是一个新的例如标签没有显示所需的字体时,这对我有用:
清理、深度清理并清空派生数据文件夹。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接