带故事板的自定义字体

通过故事板和类别中的 用户定义的运行时属性 ,可以轻松实现故事板中 UI 组件的自定义字体。

优点是,像,

  • 无需为 ui 元素定义出口
  • 无需以编程方式为元素设置字体。

要遵循的步骤

  1. 字体文件: 添加字体文件(.TTF)的应用程序包,并添加在 Info.plist 中的字体下的条目由应用程序提供的字体,因为这在文档的自定义字体。

  2. 定义类别: 添加 UIKit + IBExtensions 等文件,并添加要为其设置自定义字体的 UI 元素(如 UILabel,UIButton 等)的类别。所有类别都将具有自定义属性 say fontName 。稍后将使用故事板来设置自定义字体(如步骤 4 中所示)。

UIKit 的+ IBExtensions.h

#import <UIKit/UIKit.h>

//Category extension for UILabel
@interface UILabel (IBExtensions)

@property (nonatomic, copy) NSString *fontName;
@end

// Category extension for UITextField
@interface UITextField (IBExtensions)

@property (nonatomic, copy) NSString *fontName;
@end

// Category extension for UIButton
@interface UIButton (IBExtensions)

@property (nonatomic, copy) NSString *fontName;
@end
  1. Getters 和 Setter: 为每个添加的类别定义 fontName 属性的 getter 和 setter。

UIKit 的+ IBExtensions.m

#import "UIKit+IBExtensions.h"

@implementation UILabel (IBExtensions)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end

@implementation UITextField (IBExtensions)

- (NSString *)fontName {
    return self.font.fontName;
}

- (void)setFontName:(NSString *)fontName {
    self.font = [UIFont fontWithName:fontName size:self.font.pointSize];
}
@end

@implementation UIButton (IBExtensions)

- (NSString *)fontName {
    return self.titleLabel.font.fontName;
}

- (void)setFontName:(NSString *)fontName{
    self.titleLabel.font = [UIFont fontWithName:fontName size:self.titleLabel.font.pointSize];
}
@end
  1. 在故事板中设置字体: 在用户定义的运行时属性中添加一个条目,其中 fontName 为 keyPath,自定义字体的名称为值,类型为 String,如图所示。

StackOverflow 文档

这将在运行应用程序时设置自定义字体。

笔记:

  • Lato-Regular 是我使用的自定义字体。
  • 在 bundle 中添加的 .ttf 文件中的相同名称应该在 storyboard 中没有扩展名的情况下使用。
  • 字体大小与 UI 元素的属性检查器中定义的相同。