我的iOS项目中添加了一个字体。它在项目中并在项目构建时复制。它似乎是一个有效的字体,如果我通过应用程序列出设备上的所有字体,它将显示出来。我正确设置了plist以包含字体。我似乎无法在Xcode 4.2的故事板部分的文本控件,按钮等中显示使用它。此外它似乎不允许我键入字体名称,它强制我使用字体对话框。我也尝试在系统中安装此字体,但似乎无法在此列表中显示它。我是否需要仅在代码中执行此操作,还是可以通过故事板界面执行此操作?
请注意,我可以在代码中使用它,但通过故事板执行此操作会更方便。
答案 0 :(得分:145)
我知道这个问题很老了,但我一直在努力找到一种简单的方法来为iOS 5轻松地在Storyboard(或Interface Builder)中指定自定义字体,我发现了一个非常方便的解决方案。
首先,确保您已按照this tutorial将字体添加到项目中。还要记住,可以使用UIAppearance proxy的setTitleTextAttributes:
方法指定UINavigationBar,UITabBar和UISegmentedControl自定义字体。
将以下类别添加到UIButton,UITextField,UILabel以及需要自定义字体的任何其他组件的项目中。这些类别只是实现了一个新属性fontName
,它可以在保持字体大小的同时更改元素的当前字体。
要在Storyboard中指定字体,只需选择所需的元素(标签,按钮,textview等),然后添加用户定义的运行时属性,并将密钥路径设置为类型为 String 的 fontName ,以及带有自定义字体名称的值。
就是这样,你甚至不需要导入类别。这样,您不需要每个需要自定义字体的UI组件的插座,也不需要手动编写代码。
考虑到该字体不会在Storyboard中显示,但在设备或模拟器上运行时,您会看到它。
<强>的UIButton + TCCustomFont.h 强>:
#import <UIKit/UIKit.h>
@interface UIButton (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end
<强>的UIButton + TCCustomFont.m 强>:
#import "UIButton+TCCustomFont.h"
@implementation UIButton (TCCustomFont)
- (NSString *)fontName {
return self.titleLabel.font.fontName;
}
- (void)setFontName:(NSString *)fontName {
self.titleLabel.font = [UIFont fontWithName:fontName size:self.titleLabel.font.pointSize];
}
@end
<强>的UILabel + TCCustomFont.h 强>:
#import <UIKit/UIKit.h>
@interface UILabel (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end
<强>的UILabel + TCCustomFont.m 强>:
#import "UILabel+TCCustomFont.h"
@implementation UILabel (TCCustomFont)
- (NSString *)fontName {
return self.font.fontName;
}
- (void)setFontName:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
<强>的UITextField + TCCustomFont.h 强>:
#import <UIKit/UIKit.h>
@interface UITextField (TCCustomFont)
@property (nonatomic, copy) NSString* fontName;
@end
<强>的UITextField + TCCustomFont.m 强>:
#import "UITextField+TCCustomFont.h"
@implementation UITextField (TCCustomFont)
- (NSString *)fontName {
return self.font.fontName;
}
- (void)setFontName:(NSString *)fontName {
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
也可下载from GIST以及a single file。
如果由于未指定fontName
属性而针对运行时错误运行,则只需在项目设置中的其他链接器标志下添加标记-all_load
以强制链接器包含类别。
答案 1 :(得分:58)
从Xcode6.0开始,Xcode6.0 release注意:
Interface Builder在设计时呈现嵌入式自定义iOS字体,使用正确的尺寸更准确地预览完成的应用程序的外观。
你可以在storyboard中设置标签字体。你可以按照以下方式设置
将字体文件导入Xcode项目
在 app-info.plist 中,添加一个名为由应用程序提供的字体的密钥。它是一个数组类型,添加所有字体文件名到数组,注意:包括文件扩展名。
答案 2 :(得分:5)
这是XCode中的一个错误,自3.x以来一直没有修复。我也遇到了同样的问题,甚至尝试将它添加到我的系统中而没有运气。这是关于它的另一篇SO帖子Fonts not displaying in Interface Builder
答案 3 :(得分:3)
Monjer的回答是正确的。如果您和我一样,在编译后没有看到添加的字体,请确保将字体添加到构建阶段(目标 - &gt;构建阶段 - &gt;复制捆绑资源 - &gt;添加字体文件)
答案 4 :(得分:0)
redent84的解决方案太棒了!
我只是添加一个改进,在NSObject上添加类别,所以你只需要做一次。
NSObject的+ CustomFont.h
#import <Foundation/Foundation.h>
@interface NSObject (CustomFont)
@property (strong, nonatomic) NSString *fontName;
@property (strong, nonatomic) UIFont *font;
@end
NSObject的+ CustomFont.m
#import "NSObject+CustomFont.h"
@implementation NSObject (CustomFont)
@dynamic font;
- (NSString *)fontName
{
return self.font.fontName;
}
- (void)setFontName:(NSString *)fontName
{
self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end
答案 5 :(得分:0)
这些都不适合我,但确实如此。
#import <UIKit/UIKit.h>
@interface UILabelEx : UILabel
@end
#import "UILabelEx.h"
#import "Constants.h"
@implementation UILabelEx
- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {
[super traitCollectionDidChange: previousTraitCollection];
self.font = [UIFont fontWithName:APP_FONT size:self.font.pointSize];
}
@end
答案 6 :(得分:0)
从XCode 9.4开始,XCode仍然不直接在情节提要中尊重字体。您可以在设计时看到它们,但不能在运行时看到它们。如果您正在使用fontWithName API,就会知道它返回nil,但是在情节提要/ xib中使用时,无法知道为什么它不出现。
确保它在运行时可以从Storyboard / XIB轻松运行的唯一方法是将.ttc / .ttf添加到Copy Bundle Resources
构建阶段中。
从9.4开始,似乎不再需要将字体文件名添加到info.plist。