tableview 高度适配内容(高度随着cell行数变化而动态变化)及(监听contentsize变化)

本文介绍如何实现UITableView的高度随着cell行数动态变化,并监听UITableView的内容Size变化。通过设置estimatedRowHeight和rowHeight为UITableViewAutomaticDimension,以及注册cell实现自适应高度。同时,使用KVO观察contentSize属性,当内容Size变化时更新视图约束以适应新的高度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


//评论布局

-(void)drawPingLunViewWithArr:(NSMutableArray *)arrData{

    self.pinTab = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_WIDTH) style:UITableViewStylePlain];

    [self.contentView addSubview:self.pinTab];

    [self.pinTab mas_remakeConstraints:^(MASConstraintMaker *make) {

        make.top.mas_equalTo(self.szdz_view.mas_bottom).mas_offset(TEXT_EDGE_DISTANCE);

        make.left.right.mas_equalTo(self.contentView);

        make.height.mas_equalTo(200*arrData.count+60+40+260+40);

    }];

    [self.pinTab layoutIfNeeded];

    self.pinTab.delegate = self;

    self.pinTab.dataSource = self;

    self.pinTab.scrollEnabled = YES;

    self.pinTab.bounces = NO;

    self.pinTab.estimatedRowHeight = 100;

    self.pinTab.rowHeight = UITableViewAutomaticDimension;

    [self.pinTab registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];

    self.pinTab.separatorStyle = UITableViewCellSeparatorStyleNone;

    //添加标题

    self.pinTab.tableHeaderView = [[UIView alloc]init];

    [self.pinTab registerClass:[PingLunXQTabCell class] forCellReuseIdentifier:@"PingLunXQTabCell"];

    [self.pinTab registerClass:[ShopXQXiangSiTabCell class] forCellReuseIdentifier:@"ShopXQXiangSiTabCell"];  

     //添加观察控件的contentSize变化

    [self.pinTab addObserver:self forKeyPath:@"contentSize" options:0 context:NULL];


}

//监听contentSize变化改变约束

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {

    CGRect frame = self.pinTab.frame;

    frame.size = self.pinTab.contentSize;

    [self.pinTab mas_remakeConstraints:^(MASConstraintMaker *make) {

        make.top.mas_equalTo(self.szdz_view.mas_bottom).mas_offset(TEXT_EDGE_DISTANCE);

        make.left.right.mas_equalTo(self.contentView);

        make.height.mas_equalTo(frame.size.height);

    }];

}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{

    

    return 2;

}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    if (section==0) {

        return 2;

    } else {

        return 1;

    }

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    if (indexPath.section==0) {

        PingLunXQTabCell *cell = [tableView dequeueReusableCellWithIdentifier:@"PingLunXQTabCell"];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        cell.vc = self;

        cell.arrImgv = [@[@"2"] mutableCopy];//控制图片显隐性

        return cell;

    }else{

        ShopXQXiangSiTabCell*cell = [tableView dequeueReusableCellWithIdentifier:@"ShopXQXiangSiTabCell"];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        cell.vc = self;

        return cell;

    }

}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    

    

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

    

    return UITableViewAutomaticDimension;

}


//头高度

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    

    return 60.f;

}

//尾高度

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{

    

    return 30.f;

}

//表头

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{

    UIView *hv = [[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, 60)];

    hv.backgroundColor = [UIColor whiteColor];

    

    if (section==0) {

        self.pinLun_numL = [[UILabel alloc]init];

        [hv addSubview:self.pinLun_numL];

        self.pinLun_numL.font = MIDDLE_LIT_FONT;

        self.pinLun_numL.textColor = TEXT_HEX_MID_GRAY;

        [self.pinLun_numL mas_makeConstraints:^(MASConstraintMaker *make) {

            make.left.mas_equalTo(hv.mas_left).mas_offset(TEXT_EDGE_DISTANCE);

            make.centerY.mas_equalTo(hv.mas_centerY);

        }];

        self.pinLun_numL.text = [NSString stringWithFormat:@"评论(%ld)",12];

        

        UIImageView *pl_imgv = [[UIImageView alloc]init];

        pl_imgv.userInteractionEnabled = YES;

        [hv addSubview:pl_imgv];

        pl_imgv.image = [UIImage imageNamed:@"s_d_xiangyoujiantou"];

        [pl_imgv mas_makeConstraints:^(MASConstraintMaker *make) {

            make.right.mas_equalTo(hv).mas_offset(-TEXT_EDGE_DISTANCE);

            make.centerY.mas_equalTo(hv.mas_centerY);

            make.size.mas_equalTo(CGSizeMake(6, 10));

        }];

        

        self.pingLun_fenL = [[UILabel alloc]init];

        [hv addSubview:self.pingLun_fenL];

        self.pingLun_fenL.font = MIDDLE_LIT_FONT;

        [self.pingLun_fenL mas_makeConstraints:^(MASConstraintMaker *make) {

            make.right.mas_equalTo(pl_imgv.mas_right).mas_offset(-TEXT_LINE_DISTANCE);

            make.centerY.mas_equalTo(hv.mas_centerY);

        }];

        self.pingLun_fenL.attributedText = [self getAttriStringWithPingLunString:@"99%"];

        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(clickedPingLunXiangQing:)];

        [hv addGestureRecognizer:tap];

    } else {

        

        UILabel *lab_xs = [[UILabel alloc]init];

        [hv addSubview:lab_xs];

        lab_xs.font = MIDDLE_LIT_FONT;

        lab_xs.textColor = TEXT_HEX_MID_GRAY;

        lab_xs.text = @"相似商品";

        [lab_xs mas_makeConstraints:^(MASConstraintMaker *make) {

            make.centerX.mas_equalTo(hv.mas_centerX).mas_offset(TEXT_LINE_DISTANCE+24/2);

            make.bottom.mas_equalTo(hv.mas_bottom);

        }];

        UIImageView *xs_imgv = [[UIImageView alloc]init];

        xs_imgv.userInteractionEnabled = YES;

        [hv addSubview:xs_imgv];

        xs_imgv.image = [UIImage imageNamed:@"s_d_xiangsi-biao"];

        [xs_imgv mas_makeConstraints:^(MASConstraintMaker *make) {

            make.right.mas_equalTo(lab_xs.mas_left).mas_offset(-TEXT_LINE_DISTANCE);

            make.centerY.mas_equalTo(lab_xs.mas_centerY);

            make.size.mas_equalTo(CGSizeMake(24, 24));

        }];

        


    }

    

    return hv;

}

//区尾

-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{

    

    UIView*view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH,30)];

    view.backgroundColor = [UIColor whiteColor];

    if (section==0) {

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];

        [view addSubview:btn];

        btn.titleLabel.font = LITTLE_L_FONT;

        [btn setTitleColor:TEXT_HEX_LIGHT_L_GRAY forState:UIControlStateNormal];

        btn.layer.cornerRadius = 20/2;

        btn.layer.borderColor = TEXT_HEX_LIGHT_L_GRAY.CGColor;

        btn.layer.borderWidth = 1;

        [btn mas_makeConstraints:^(MASConstraintMaker *make) {

            make.center.mas_equalTo(view);

            make.size.mas_equalTo(CGSizeMake(106, 20));

        }];

        [btn setTitle:@"查看全部评论" forState:UIControlStateNormal];

        [btn addTarget:self action:@selector(clickedChaKanPingLun:) forControlEvents:UIControlEventTouchUpInside];

    } else {

        UILabel *lab_xs = [[UILabel alloc]init];

        [view addSubview:lab_xs];

        lab_xs.font = MIDDLE_LIT_FONT;

        lab_xs.textColor = TEXT_HEX_LIGHT_L_GRAY;

        lab_xs.text = @"上拉查看商品详情";

        [lab_xs mas_makeConstraints:^(MASConstraintMaker *make) {

            make.centerX.mas_equalTo(view.mas_centerX).mas_offset(TEXT_LINE_DISTANCE+16/2);

            make.centerY.mas_equalTo(view.mas_centerY);

        }];

        self.shanglaImgv = [[UIImageView alloc]init];

        self.shanglaImgv.userInteractionEnabled = YES;

        [view addSubview:self.shanglaImgv];

        self.shanglaImgv.image = [UIImage imageNamed:@"s_d_xiangshang-biao"];

        [self.shanglaImgv mas_makeConstraints:^(MASConstraintMaker *make) {

            make.right.mas_equalTo(lab_xs.mas_left).mas_offset(-TEXT_LINE_DISTANCE);

            make.centerY.mas_equalTo(view.mas_centerY);

            make.size.mas_equalTo(CGSizeMake(24, 24));

        }];

    }

    return view;

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值