在tableView中,使用xib自定义view设置tableHeaderView时注意事项

使用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;
}

 

 

 

 

 

 

 

 

你可能感兴趣的:(OC,iOS)