动态字体的使用方法非常简单,首先根据文本样式创建一个UIFont对象,然后将其设置为文本控件的字体就可以了(例如UILabel和UITextField的font属性)。下面就更新BNRDetailViewController,在代码中使用动态字体。
由于本章会设置界面中所有UILabel对象和UITextField对象的font属性,而其中三个UILabel对象没有对应的插座变量,因此需要在BNRDetailViewController.m的类扩展中为三个UILabel对象设置插座变量,代码如下:
@interface BNRDetailViewController ()
@property (nonatomic, strong) UIPopoverController *imagePickerPopover;
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *serialNumberField;
@property (weak, nonatomic) IBOutlet UITextField *valueField;
@property (weak, nonatomic) IBOutlet UILabel *dateLabel;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIToolbar *toolbar;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *cameraButton;
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *serialNumberLabel;
@property (weak, nonatomic) IBOutlet UILabel *valueLabel;
@end
然后添加一个方法,为正文(UIFontTextStyleBody)的UIFont对象创建文本样式,再赋给所有UILabel对象和UITextField对象的font属性,代码如下:
- (void)updateFonts
{
UIFont *font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
self.nameLabel.font = font;
self.serialNumberLabel.font = font;
self.valueLabel.font = font;
self.dateLabel.font = font;
self.nameField.font = font;
self.serialNumberField.font = font;
self.valueField.font = font;
}
接下来在viewWillAppear:中调用updateFonts方法,当UILabel对象将要出现在屏幕上时,修改它们的字体:
self.imageView.image = imageToDisplay;
[self updateFonts];
}
preferredFontForTextStyle:方法会根据用户首选字体和传入的文本样式返回对应的UIFont对象。构建并运行应用,这时界面还不会发生变化。
下面修改用户首选字体。按下iOS设备的Home键(如果是iOS模拟器,选择硬件→首页),然后打开设置应用,选择通用(General)→文字大小(Text Size),将滑块拖曳到最左端,设置用户首选字体为最小值(见图20-3)。
图20-3 修改用户首选字体大小
现在回到Homepwner的BNRDetailViewController界面,可以发现,界面中的文本控件并没有根据用户首选字体调整文字大小。这是因为,当应用从后台返回到前台运行时,BNRDetailViewController没有再次收到viewWillAppear:消息,所以没有及时更新文本控件的字体。为了解决该问题,必须设法观察并响应用户首选字体的改变。