接下来在BNRItemsViewController中使用动态字体,为此需要做出两个方面的修改:根据用户首选字体动态改变UITableView的行高;与BNRDetailViewController类似,修改BNRItemCell,动态改变contentView中文本控件的文字大小。
首先修改UITableView的行高。如果用户选取了较大的字体,那么行高也要相应增加,避免文字过于拥挤。通过UIApplication单例的preferredContentSizeCategory属性就可以确定当前用户首选字体大小,该属性返回表示字体大小的字符串常量,以下是所有字体大小常量:
• UIContentSizeCategoryExtraSmall
• UIContentSizeCategorySmall
• UIContentSizeCategoryMedium
• UIContentSizeCategoryLarge (默认值)
• UIContentSizeCategoryExtraLarge
• UIContentSizeCategoryExtraExtraLarge
• UIContentSizeCategoryExtraExtraExtraLarge
打开BNRItemsViewController.m,创建一个方法,根据用户首选字体大小修改UITableView的行高,然后在viewWillAppear:中调用该方法,代码如下:
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView reloadData];
[self updateTableViewForDynamicTypeSize];
}
- (void)updateTableViewForDynamicTypeSize
{
static NSDictionary *cellHeightDictionary;
if (!cellHeightDictionary) {
cellHeightDictionary = @{
UIContentSizeCategoryExtraSmall : @44,
UIContentSizeCategorySmall : @44,
UIContentSizeCategoryMedium : @44,
UIContentSizeCategoryLarge : @44,
UIContentSizeCategoryExtraLarge : @55,
UIContentSizeCategoryExtraExtraLarge : @65,
UIContentSizeCategoryExtraExtraExtraLarge : @75 };
}
NSString *userSize =
[[UIApplication sharedApplication] preferredContentSizeCategory];
NSNumber *cellHeight = cellHeightDictionary[userSize];
[self.tableView setRowHeight:cellHeight.floatValue];
[self.tableView reloadData];
}
构建并运行应用,首先在设置应用中修改用户首选字体,然后重新启动应用,可以发现,UITableView的行高会根据首选字体大小自动调整。(如果没有重新启动应用而是直接返回应用,就需要先进入BNRDetailViewController,再返回BNRItemsViewController,以便BNRItemsViewController可以收到viewWillAppear:消息。)
与BNRDetailViewController相同,BNRItemsViewController也需要注册为UIContentSizeCategoryDidChangeNotification的观察者,观察并响应用户首选字体的改变。
在BNRItemsViewController.m的init方法中将BNRItemsViewController注册为UIContentSizeCategoryDidChangeNotification的观察者,然后在dealloc中移除观察者。注意,响应该通知的方法是刚才实现的updateTableViewForDynamicTypeSize。
self.navigationItem.rightBarButtonItem = bbi;
self.navigationItem.leftBarButtonItem = [self editButtonItem];
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self
selector:@selector(updateTableViewForDynamicTypeSize)
name:UIContentSizeCategoryDidChangeNotification
object:nil];
}
return self;
}
- (void)dealloc
{
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self];
}
构建并运行应用,这次一旦修改了用户首选字体,UITableView就会立刻根据首选字体大小改变行高。