Autolayout uitableviewcell 自适应cell高度

uitableview的常用程度就不用说了,是最强大也是最复杂的UI控件之一,iPhone发展到6代以上,autolayout技术显得越来越重要,甚至是不用不行的程度了;

关于autolayout,很多人用的是storyboard活xib做的,但对于一个讨厌拖控件,讨厌把代码工作变成美图设计工作的菜鸟,还是喜欢纯代码autolayout,用到的有苹果原生的layout约束(这个简直坑爹,代码成倍增加)、VFL语言(这个挺好用,不过比较底层,容易出错)、masonry(目前觉得最好用的纯码autolayout)。。。

uitableviewcell里面的内容用了autolayout后,怎么autolayout cell本身的高度呢??也就是在

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 这个函数里面怎么返回一个autolayout的cell高度值?

关键点就在于怎么拿到cell里面所有内容的frame.height, autolayout的控件如何拿到frame?  有两个方法,利用layoutSubviews 和layoutIfNeeded两个函数可以得到控件autolayout后的frame ,比如想拿到某个Button的frame,执行 [myBtn layoutIfNeeded] 后就可以了。

具体怎么拿到uitableviewcell里面所有的控件的frame:

用UIlabel的preferredMaxLayoutWidth属性和 sizeWithFont: constrainedToSize lineBreakMode:  这个方法得到自适应uilabel根据文字自适应高度后的frame,至于其他button,uiview等,直接就可以拿到它们的frame了,如下可以得到cell的autolayout后的高度self.totalHeigh:

-(void)layoutSubviews{

       [self layoutIfNeeded];

    float width=self.frame.size.width-20;

    nameLabel.preferredMaxLayoutWidth= width;

    sellInfoLabel.preferredMaxLayoutWidth=width;

    serviceLabel.preferredMaxLayoutWidth=width;

    CGSize labelSize = [nameLabel.text sizeWithFont:nameLabel.font

                              constrainedToSize:CGSizeMake(width, MAXFLOAT)

                                  lineBreakMode:NSLineBreakByWordWrapping];

    CGSize labelSize1 = [sellInfoLabel.text sizeWithFont:sellInfoLabel.font

                                  constrainedToSize:CGSizeMake(width, MAXFLOAT)

                                      lineBreakMode:NSLineBreakByWordWrapping];

    CGSize labelSize2 = [serviceLabel.text sizeWithFont:serviceLabel.font

                                  constrainedToSize:CGSizeMake(width, MAXFLOAT)

                                      lineBreakMode:NSLineBreakByWordWrapping];

    CGSize labelSize3 = [priceLabel.text sizeWithFont:priceLabel.font

                                           constrainedToSize:CGSizeMake(width, MAXFLOAT)

                                               lineBreakMode:NSLineBreakByWordWrapping];

    self.totalHeigh = totalOffset+ labelSize.height+labelSize1.height+labelSize2.height+labelSize3.height;    //totalOffset 是几个控件垂直方向的间隙总和。

    [super layoutSubviews ];

}


上面的方法是cell里面的方法,如何在uitableview的heightForRowAtIndexPath返回cell的高度呢? 很简单,实例化一个cell对象后设置内容,然后返回cell的totalheigh就可以了

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

{

    int row = (int)[indexPath row];

    NSUInteger section = [indexPath section];

    if (section == 0) {

       if(row == 1){

                GoodsDetailCell1 *cell=  [[GoodsDetailCell1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];

                [cell setCellContent:_goods currPri:_currPriStr];  //这里是设置cell的内容,在cell的这个函数的最后要调用上面提到的layoutSubviews以便得到cell的totalHeigh!!

                return cell.totalHeigh;

            }

}


关于uitableviewcell的autolayout,其实网上还可以搜到其他几个方法,但貌似都说得比较复杂,,,,搞半天没效果,最后自己捣腾,发现其实只要在layoutSubviews拿到控件autolayout后的frame就足够了。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值