Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2477202
  • 博文数量: 877
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 5920
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-05 12:25
个人简介

技术的乐趣在于分享,欢迎多多交流,多多沟通。

文章分类

全部博文(877)

文章存档

2021年(2)

2016年(20)

2015年(471)

2014年(358)

2013年(26)

分类: iOS平台

2015-12-07 23:16:58


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

阅读(1191) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~