给UITableViewCell动态调整高度

1500阅读 0评论2015-12-07 jeffasdasd
分类:iOS平台


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就行了。

上一篇:iPhone实战:动态改变UITableView中的Cell高度
下一篇:使用Autolayout实现UITableView的Cell动态布局和高度动态改变