iOS tableHeaderView使用frame和Masonry對比


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);
    }];

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM