tableHeaderView 對大家都不陌生,一直用到。但使用frame設置和Masonry其實是有差別的。先簡述下我遇到的問題
自動布局設置tableHeaderView,滾動會有問題,但tableHeaderView內部使用Masonry是可以的
一、懶加載方式創建tableHeaderView(適合比較復雜的布局,或高度動態變化,時有時無,代碼封裝,可讀性比較好)
1、懶加載創建
- (ICKTrendTopMsgView *)topView { if (!_topView) { _topView = [[ICKTrendTopMsgView alloc] init]; WeakObj(self); _topView.btnClick = ^{ Weakself.iCKTiltleModel.msgBottomCount = nil; ICKDymMsgListViewController *vc = [ICKDymMsgListViewController new]; vc.unreadMsgIdSet = Weakself.iCKTiltleModel.unReadMessageIdList; [Weakself pushViewController:vc]; if (Weakself.msgBtnClick) Weakself.msgBtnClick(); }; } return _topView; }
2、設置tableHeaderView
// topview 不隨tableview滾動 // [self.view addSubview:self.topView]; // [self.topView mas_remakeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.view.mas_left); // make.top.equalTo(self.view.mas_top); // make.height.mas_equalTo(0); // make.width.mas_equalTo(LL_ScreenWidth); // }]; // // [mainTableView mas_remakeConstraints:^(MASConstraintMaker *make) { // make.left.equalTo(self.view.mas_left); // make.top.equalTo(self.topView.mas_bottom); // make.bottom.equalTo(self.view.mas_bottom); // make.width.mas_equalTo(LL_ScreenWidth); // }]; // tableHeaderView 0.01的時候才有效果 topview 隨tableview滾動 // frame self.topView.frame = CGRectMake(0, 0, LL_ScreenWidth, 0.01); mainTableView.tableHeaderView = self.topView; // 自動布局設置tableHeaderView 會有問題 // mainTableView.tableHeaderView = self.topView; // [self.topView mas_remakeConstraints:^(MASConstraintMaker *make) { // make.height.mas_equalTo(0.01); // make.width.mas_equalTo(LL_ScreenWidth); // }]; [mainTableView mas_remakeConstraints:^(MASConstraintMaker *make) { make.left.equalTo(self.view.mas_left); make.top.equalTo(self.view.mas_top); make.bottom.equalTo(self.view.mas_bottom); make.width.mas_equalTo(LL_ScreenWidth); }];
3、動態變換tableHeaderView高度
- (void)setICKTiltleModel:(ICKTiltleModel *)iCKTiltleModel { _iCKTiltleModel = iCKTiltleModel; if (iCKTiltleModel.msgBottomCount.integerValue) { NSString *str = [NSString stringWithFormat:@"%@條新消息",ObjErrorCheck(iCKTiltleModel.msgBottomCount)]; [self.topView.btn setTitle:str forState:UIControlStateNormal]; self.topView.btn.hidden = NO; self.topView.height = 54; [self.topView.btn layoutButtonWithEdgeInsetsStyle:MKButtonEdgeInsetsStyleRight imageTitleSpace:10]; } else { self.topView.btn.hidden = YES; // topview 不隨tableview滾動 // [self.topView mas_updateConstraints:^(MASConstraintMaker *make) { // make.height.mas_equalTo(0); // }]; self.topView.height = 0.01; } // 更新frame之后要重新設置tableHeaderView // frame mainTableView.tableHeaderView = self.topView; }
小記:
1、topview 不隨tableview滾動 使用 [self.view addSubview:self.topView];可以正常設置高度,高度變化后直接更新topview高度即可
2、topview 隨tableview滾動 使用 mainTableView.tableHeaderView = self.topView; 且用frame方式並且高度要0.01才有效果,高度變化后更新topview高度同時再次設置tableHeaderView
二、直接創建tableHeaderView(適合比較簡單的表頭,高度固定)
UIView *bgView = [[UIView alloc]initWithFrame:CGRectMake(0,0,0,135)]; bgView.backgroundColor = [UIColor clearColor]; mainTableView.tableHeaderView = bgView; UIView *contentView = [[UIView alloc]init]; contentView.backgroundColor = XZWL_COLOR_FFFFFF; [bgView addSubview:contentView]; [contentView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(bgView).offset(10); make.left.equalTo(bgView).offset(10);; make.right.equalTo(bgView).offset(-10);; make.bottom.equalTo(bgView); }]; [self.view setNeedsLayout]; [self.view layoutIfNeeded]; [contentView setCornerOnTop:8]; UIImageView *thingsImage = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"carrer_circle_value_header"]]; thingsImage.contentMode = UIViewContentModeScaleAspectFit; [contentView addSubview:thingsImage]; [thingsImage mas_makeConstraints:^(MASConstraintMaker *make) { make.centerX.equalTo(contentView); make.bottom.equalTo(contentView); }];