假设现在有这么一个需求:
- controller中有一个tableView
- tableView设置一个headerView
- headerView中有一个label,距离headerView的上下左右距离为10,
- 现在要求headerView能够根据label的大小自适应高度
创建controller
@interface ViewController ()<UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) UILabel *headerLable;
@property (strong, nonatomic) UIView *headerView;
@end
创建view并设置约束
//Auto Layout能够计算出正确的界面的必要条件是约束充分
//创建label
self.headerLable = [UILabel new];
self.headerLable.numberOfLines = 0;
//创建headerView
self.headerView = [UIView new];
[self.headerView addSubview:self.headerLable];
self.tableView.tableHeaderView = self.headerView;
//设置约束
[self.headerLable mas_makeConstraints:^(MASConstraintMaker *make) {
make.edges.mas_equalTo(self.headerView).valueOffset([NSValue valueWithUIEdgeInsets:UIEdgeInsetsMake(10, 10, 10, 10)]);
}];
[self.headerView mas_makeConstraints:^(MASConstraintMaker *make) {
make.width.mas_equalTo(self.view.mas_width);
}];
//设置文本
self.headerLable.text = @"测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本测试文本";
在以前的开发过程中 如果headerView是加在UIView上的话 此时label和header是自适应显示的
但是tableView比较特殊 往往这个时候显示出来的结果不是我们想要的
此时只需要做加两行代码即可正常显示
[self.tableView.tableHeaderView layoutIfNeeded];
self.tableView.tableHeaderView = self.headerView;
1 .修改tableView的tableHeaderView界面时,界面并不能及时刷新,可手动调用layoutIfNeeded 此时view高度为理想高度
2 .tableViewHeader高度变化时,界面也不能及时刷新 需要重新将headerView设置为tableView的tableHeaderView,界面即可正确显示了
3 .当然,使用auto layout时,约束条件必须充分 才能计算出正确高度哦^^
虽然说只是两行简单的代码,不过在开发的时候可是耗费了我很长时间来解决这个问题
故在此记录下
如果大家有更好的解决方案,希望不吝赐教