感谢作者_http://blog.csdn.net/zhangao0086/article/details/7165041
在网上看到有人如此实现动态调整高度:点击。
不至于为了获取高度创建一个不需要的cell。
主要有两个地方需要调整高度,一个是自己创建的UILabel或其它子视图,另一个就是cell的高度。
cell内部的view的frame通过重写cell的layoutSubviews方法就行了,就也是一种标准做法:
-(void)layoutSubviews{
[super layoutSubviews];
self.headImageView.origin = CGPointMake(10, 10);
self.userNameLabel.size = getTextSize(self.userNameLabel.font, self.userNameLabel.text,
self.contentView.width - self.headImageView.right);
self.userNameLabel.origin = CGPointMake(self.headImageView.right + 10, self.headImageView.y);
}
而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.content, ContentLabelMaxWidth).height;
float contentImageViewHeight ;
if (dynamic.contentImgList.count) {
contentImageViewHeight = [MSDynamicContentImageView heightForDynamicContentImage:dynamic];
} else {
contentImageViewHeight = -10;
}
return contentLabelY + contentHeight + 10 + contentImageViewHeight + 10;
}
在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就行了。