帶故事板的自定義字型

通過故事板和類別中的 使用者定義的執行時屬性 ,可以輕鬆實現故事板中 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 元素的屬性檢查器中定義的相同。