首页 » iOS编程(第4版) » iOS编程(第4版)全文在线阅读

《iOS编程(第4版)》20.4 确定用户首选字体大小

关灯直达底部

接下来在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就会立刻根据首选字体大小改变行高。