iOS 7中的自定义字体

我正在开发一个游戏,我想在我的应用程序中使用自定义字体。 我使用SpriteKit,如果这很重要。 我已经尝试使用这个https://github.com/deni2s/IBCustomFonts,但我不能让它与这种字体工作http://www.fontspace.com/freaky-fonts/emulogic

我已经尝试了各种各样的东西,我已经注册了应用程序的info.plist上的字体…有谁知道发生了什么事?

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

  1. 您需要将.otf或.ttf中的字体复制到您的项目中。 例如在支持文件。
  2. 您需要编辑.plist文件。 将“应用程序提供的字体”添加到您的plist中,并在项目0中复制您复制到支持文件WITH扩展名的字体的确切文件名。 例如:“JosefinSansStd-Light_0.otf”
  3. 确保您导入到您的应用程序的字体正在打包到应用程序本身。 通过select您的目标 ,然后build立阶段 ,然后复制捆绑资源 。 如果您在那里看不到您的字体,请将其从支持文件中拖出。

最后,你想列出所有的字体,当应用程序启动只是为您的字体看到可用的名称。 你会用这个小小的代码来做到这一点:

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

在打印结果中search您的字体,例如,我将search“Josefin”,我会看到实际的字体名称是“JosefinSansStd-Light”。 之后,您只需要使用该字体:

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

在iOS8中,您可以直接将字体添加到项目中,并且可以在界面构build器中看到它们。 修改您的代码来解决这个问题,但编程设置为iOS7的字体,并在xCode6接口生成器中select它。 PS。 xCode6中的界面构build器为您提供了正确的字体名称,您可以将其复制粘贴到以下代码中。

 #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. 在您的info.plist中注册字体,添加“应用程序提供的字体”条目。 放置字体文件名称,而不是字体名称。 像font.ttf(我想你已经这样做了)
  2. 转到项目导航器上的项目,点击项目名称,然后转到“构build阶段”,然后在“复制包资源”中查看底部,有很多文件和search“+”标志。 一个popup窗口将打开您的项目文件。 search您的字体文件并将其添加到捆绑。
  3. 最后检查字体名称。 在代码中使用它时,必须使用字体名称,而不是文件名。 要知道字体名称,双击Finder中的字体文件,将打开一个窗口显示字体。 检查窗口标题,这是你必须使用的字体的名称。

并build议,在..Prefix.pch文件中将该名称添加为macros。 如果您不得不多次使用字体,在项目中使用它会更容易。

我想你的问题是,你正确地注册了字体,但没有复制到应用程序包。 所以当执行应用程序时,找不到字体。 这就是为什么第二步很重要。 我花了很多时间试图找出第一次:)

快速实现这一目标

如果您希望在应用程序启动时列出所有字体,只需查看字体的可用名称即可。 你可以用这个小小的代码来做到这一点:

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

我从来没有能够得到这些答案工作多次尝试。 唯一的方法,我有一个自定义的字体在其中按照接受的答案中的指令,然后在故事板中使用该字体创build一个隐藏的标签。 我可以使用字体编程。 我知道这很奇怪,但是它对我很有用。

如果你在Xcode 6中,它就像它一样容易。 只需要在你的项目中添加一个font文件夹,将你的字体添加到文件夹中,然后就可以了。

在这里输入图像描述

如果上面的方法都不适合你,而且你恰好使用你的自定义字体“编程”(即你没有在任何xib中使用它),那么你将需要至less在一个xib,在任何地方的任何地方使用它。

(PS斯图亚特·克拉克 – 已经回答了这个问题,所以我没有信任,但是我决定把它作为一个单独的答案来修改和发布,因为我错过了他的答案,当我读到它的时候我并不清楚。当我在xib中testing自定义字体时,偶然发现这个解决scheme,并且我发现它在其他地方以编程方式工作,但是当我从xib中删除字体时,它以编程方式停止工作。

更新了Swift 3。

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

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

干净,深层清洁和空导出的数据文件夹。

 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