给UITableViewCell动态调整高度

甘兴学
2023-12-01

感谢作者_http://blog.csdn.net/zhangao0086/article/details/7165041

在网上看到有人如此实现动态调整高度:点击

不至于为了获取高度创建一个不需要的cell。

主要有两个地方需要调整高度,一个是自己创建的UILabel或其它子视图,另一个就是cell的高度。

cell内部的view的frame通过重写cell的layoutSubviews方法就行了,就也是一种标准做法:

-(void)layoutSubviews{

    [super layoutSubviews];

    

    self.headImageView.origin = CGPointMake(1010);

    self.userNameLabel.size = getTextSize(self.userNameLabel.fontself.userNameLabel.text,

                                          self.contentView.width - self.headImageView.right);

    self.userNameLabel.origin = CGPointMake(self.headImageView.right + 10self.headImageView.y);

}

内部子视图的计算全部基于cell.contentView(因为子视图一般都是加在contentView上的)来计算。

而layoutSubviews方法会在cell的frame发生变化的时候调用,而cell高度的计算只能放在heightForRowAtIndexPath方法里进行,所以我们只用在heightForRowAtIndexPath方法里返回正确的高度就行了,至于计算方法,应该放在cell的一个类方法里,因为只有cell本身才知道自己内部的情况,这也是更好的封装内部实现: 

+(CGFloat)heightForDynamicCell:(MSDynamic *)dynamic;

内部实现就是计算cell 需要的高度:

+(CGFloat)heightForDynamicCell:(MSDynamic *)dynamic {

    static CGFloat contentLabelY = 40.3f;

    CGFloat contentHeight = getTextSize(ContentLabelFont, dynamic.contentContentLabelMaxWidth).height;

    

    float contentImageViewHeight ;

    if (dynamic.contentImgList.count) {

        contentImageViewHeight = [MSDynamicContentImageView heightForDynamicContentImage:dynamic];

    } else {

        contentImageViewHeight = -10;

    }

    

    return contentLabelY + contentHeight + 10 + contentImageViewHeight + 10;

}

这里面还有进一步对其他子视图高度计算的封装,思想是一样的,最终返回cell需要的高度就行了。

heightForRowAtIndexPath方法中把对应的Model给cell即可:

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

    MSDynamic *dynamic = self.dynamicList[indexPath.row];

    return [MSDynamicCell heightForDynamicCell:dynamic];

}

getTextSize只是一个工具方法,用于计算text所需要的size:

CGSize getTextSize(UIFont *font,NSString *text, CGFloat maxWidth){

    if (iOS_VERSION_NOT_LESS_THAN_7) {

        CGSize textSize = [text boundingRectWithSize:CGSizeMake(maxWidth, MAXFLOAT)

                                             options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading

                                          attributes:@{NSFontAttributeName: font}

                                             context:nil].size;

        return textSize;

    }

    

    CGSize textSize = [text sizeWithFont:font

                       constrainedToSize:CGSizeMake(maxWidth, MAXFLOAT)

                           lineBreakMode:NSLineBreakByCharWrapping];

    return textSize;

}

期间使用了一些公共宏,比如:MAXFLOAT等等,只在cellForRowAtIndexPath里面配置好cell,计算高度交给heightForRowAtIndexPath就行了。

 类似资料: