故事板中的自定义字体?

时间:2012-02-01 04:20:55

标签: iphone ios cocoa-touch storyboard custom-font

我的iOS项目中添加了一个字体。它在项目中并在项目构建时复制。它似乎是一个有效的字体,如果我通过应用程序列出设备上的所有字体,它将显示出来。我正确设置了plist以包含字体。我似乎无法在Xcode 4.2的故事板部分的文本控件,按钮等中显示使用它。此外它似乎不允许我键入字体名称,它强制我使用字体对话框。我也尝试在系统中安装此字体,但似乎无法在此列表中显示它。我是否需要仅在代码中执行此操作,还是可以通过故事板界面执行此操作?

请注意,我可以在代码中使用它,但通过故事板执行此操作会更方便。

7 个答案:

答案 0 :(得分:145)

更新:Xcode 6 Interface Builder现在允许您选择自定义字体并在设计时正确呈现它们。

我知道这个问题很老了,但我一直在努力找到一种简单的方法来为iOS 5轻松地在Storyboard(或Interface Builder)中指定自定义字体,我发现了一个非常方便的解决方案。

首先,确保您已按照this tutorial将字体添加到项目中。还要记住,可以使用UIAppearance proxysetTitleTextAttributes:方法指定UINavigationBar,UITabBar和UISegmentedControl自定义字体。

将以下类别添加到UIButton,UITextField,UILabel以及需要自定义字体的任何其他组件的项目中。这些类别只是实现了一个新属性fontName,它可以在保持字体大小的同时更改元素的当前字体。

要在Storyboard中指定字体,只需选择所需的元素(标签,按钮,textview等),然后添加用户定义的运行时属性,并将密钥路径设置为类型为 String fontName ,以及带有自定义字体名称的值。

Custom font Storyboard

就是这样,你甚至不需要导入类别。这样,您不需要每个需要自定义字体的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中设置标签字体。你可以按照以下方式设置

  1. 获取自定义字体文件( .ttf, .ttc)
  2. 将字体文件导入Xcode项目

    enter image description here

  3. app-info.plist 中,添加一个名为由应用程序提供的字体的密钥。它是一个数组类型,添加所有字体文件名到数组,注意:包括文件扩展名。

  4. enter image description here

    1. 在故事板中,将UILabel拖到界面,选择标签,然后导航到属性检查器,单击字体选择区域的右侧图标按钮。在弹出式面板中,选择字体自定义,然后选择嵌入字体名称的系列
    2. enter image description here

      参考

答案 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。