动态字体是iOS7才被引入到iPhone上的,我们可以在手机的设置-通用-字体大小里面设置手机显示的字体大小,设置后我们可以发现很多系统自带的app界面字体或者布局都有所改变,如果我们的app也想要提供这样一个动态字体的体验,那就可以用iOS7引入的DynamicType来实现。
DynamicType是属于Text Kit下面的一个特性
Text Kit是建立在Core Text框架上的
CoreText.framework是一个庞大而复杂的框架,而Text Kit在继承了Core Text强大功能的同时给开发者提供了比较友好的面向对象的API。
实现过程:
1.注册一个DynamicType的消息通知: __ UIContentSizeCategoryDidChangeNotification__
2.在系统字体大小改变的通知后来更新界面上需要支持DynamicType的UIKit的font
self.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
//这里调用setNeedsLayout做一个需要重新布局的标记,在下一个draw周期(60Hz)自动重绘
[self.view setNeedsLayout];
3.最后在layoutSubview或者viewDidLayoutSubview里面更新textLabel的frame
在iOS 10之后,只需要两行代码便可实现:
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 1. 设置字体大小
self.demoLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody];
// 2. 允许调整
self.demoLabel.adjustsFontForContentSizeCategory = YES;
}