美文网首页UI基础iOS学习IOS
UITableView tableHeaderView auto

UITableView tableHeaderView auto

作者: 冰琳92 | 来源:发表于2016-10-13 16:50 被阅读3590次

假设现在有这么一个需求:

  • 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时,约束条件必须充分 才能计算出正确高度哦^^

虽然说只是两行简单的代码,不过在开发的时候可是耗费了我很长时间来解决这个问题
故在此记录下

如果大家有更好的解决方案,希望不吝赐教

相关文章

网友评论

  • Caiflower:应该要先设置tableView.estimatedSectionHeaderHeight,
    然后在设置tableView.sectionHeaderHeight = UITableViewAutomaticDimension
    不过还是会有问题, 这个表情可能是异步获取的,然后每个sectionHeader 还高度不一致的情况下,iOS9 会有 bug,iOS10 ,iOS11 没问题
  • 70bf62aea5ca:牛逼,唯一一个真正好用的
  • Jaesun:用Xib而已时很有用!
  • 跳跳虾:貌似这样没用呀
  • f5be66e60ef9:没用啊
    成长_路上:@冰琳92 什么意思
    冰琳92:请确认你的约束充分: header可以计算出自己的高度

    ps 使用此解决方案的时候,需tableView已刷新到最终的width,因为header的宽度会和当前tableView的宽度一致
  • 小鱼吐的泡泡:如果tableheaderView也是通过sb拖拽的,不是代码创建的呢?
    冰琳92:请亲测,原理都是一个的
  • 动感超人丶:么用啊
    冰琳92:@动感超人丶 你看看约束完备不,只要是完备的,是可以计算出来的
  • 冷灬叶枫:[self.tableView layoutIfNeeded]; 不谢

本文标题:UITableView tableHeaderView auto

本文链接:https://www.haomeiwen.com/subject/xegwyttx.html