iOS 7中的自定义字体

时间:2014-02-12 19:32:24

标签: ios iphone fonts

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

我尝试了各种各样的东西,并且我在应用的info.plist上注册了字体......有谁知道发生了什么?

9 个答案:

答案 0 :(得分:277)

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

  1. 您需要将.otf或.ttf中的字体复制到项目中。例如,在支持文件中。
  2. 您需要修改 .plist 文件。将“应用程序”键提供的字体添加到您的plist中,然后在项目0 中复制您复制到支持文件WITH扩展名的字体的确切文件名。例如:“JosefinSansStd-Light_0.otf”
  3. 确保导入应用的字体正在打包到应用中。通过选择目标,然后构建阶段,然后复制捆绑资源来实现。如果您没有看到其中的字体,请将其从支持文件
  4. 中拖出

    最后,您希望在应用启动时列出所有字体,只是为了查看字体的可用名称。你会用这一小段代码来做到这一点:

    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;  
        }
    

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

答案 1 :(得分:24)

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

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

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

答案 2 :(得分:20)

快速实现这一目标

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

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

答案 3 :(得分:5)

我多次尝试过,从来没有能够得到这些答案。唯一的方法是我有一个自定义字体,以遵循接受的答案中的说明然后在故事板中创建一个使用该字体的隐藏标签。我可以以编程方式使用该字体。我知道奇怪和hacky,但它对我有用。

答案 4 :(得分:3)

如果您使用Xcode 6,它就会变得如此简单。只需在项目中添加font文件夹,将您的字体添加到文件夹中,就可以了。

enter image description here

答案 5 :(得分:3)

如果上述方法都不适合您,并且您碰巧使用自定义字体&#34;以编程方式&#34;只是(即你没有在任何xib中使用它)然后你需要在一个xib中的任何地方至少使用它一次。

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

答案 6 :(得分:2)

针对Swift 3进行了更新。

let fontFamilies:[String] = UIFont.familyNames

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

答案 7 :(得分:0)

也许是一个快速修复 - 当字体已经工作时,这对我来说是这样的,但是一个新的例如标签没有显示所需的字体:

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

答案 8 :(得分: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