使用xib自定义view来实现tableHeaderView是比较常见的,在开发中,如果想要做一个随着cell一起滚动的而且布局比较麻烦的我们经常选用自定义view。我使用xib做了一个view,做的时候有几点问题在这里总结一下:
1.创建一个继承UIView的类,同时创建一个同名的xib,并将xib的view的class设置为该类,注意不是File's owner
2.在initWithFrame方法中加载xib和初始化view
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
self = [[NSBundle mainBundle]loadNibNamed:NSStringFromClass([self class]) owner:self options:nil][0];
}
return self;
}
3.在使用tableHeaderView的控制器中创建view,并设置frame的高度,另外可以使用布局约束自适应:
self.headerView.mj_h = [self.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
self.tableView.tableHeaderView = self.headerView;
另外要注意,设置tableHeaderView之前必须要指定tableView的frame,否则约束会乱,防止出现问题,建议使用frame设置
- (UITableView *)tableView {
if (!_tableView) {
// 设置tableHeaderView时,防止出现问题,都使用frame设置
_tableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];
_tableView.delegate = self;
_tableView.dataSource = self;
[_tableView registerNib:[UINib nibWithNibName:@"CellNibName" bundle:nil] forCellReuseIdentifier:CellID];
_tableView.estimatedRowHeight = 100;
_tableView.rowHeight = UITableViewAutomaticDimension;
}
return _tableView;
}
4.如果tableHeaderView中有高度的变化需求,在设置完约束的变化后,需要执行layoutIfNeeded方法。tableView接收到刷新的约束变化后,重新获取下headerView的高度,执行setTableHeaderView即可。如下图的closeBlock中的设置:
// tableHeaderView的约束改变
- (IBAction)closeBottomViewAction:(id)sender {
self.bottomViewHeight.constant = 0;
[self layoutIfNeeded];
if (self.closeBlock) {
self.closeBlock();
}
}
// tableHeaderView的懒加载
- (HeaderView *)headerView {
if (!_headerView) {
WeakSelf
_headerView = [[HeaderView alloc]initWithFrame:CGRectZero];
_headerView.closeBlock = ^{
weakself.headerView.mj_h = [weakself.headerView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
[weakself.tableView beginUpdates];
[weakself.tableView setTableHeaderView:weakself.headerView];
[weakself.tableView endUpdates];
};
}
return _headerView;
}