iOS UI设计: 在Autolayout自适应的情况下tableviewcell高度自适应

来源:互联网 发布:sql server guid 编辑:程序博客网 时间:2024/06/06 01:02

经常查阅资料和自己的研究,现在有一个较为高效的方法。

首先前提条件

1. Cell 用xib方式自定义。 内嵌有 icon头像 labelview多行文本框

2. 导致高度变化的就是这个多行文本框,需要手动判断高度。


方法: 1 .  Cell 采取xib绘图的方式,把其余不变控件约束好, 重点把labelview的上下 top和bottom 对 cell的contentview做好约束,这样为了保证高度计算后自动拉伸多行。

            2.   代码编写

     首先是设置多行参数

titleLabel.numberOfLines = 0;

本文适用于已经掌握基本的自定义cell的同学。我也是做个笔记。重点在自适应高度。在Cell自定义初始化后。

   3.

@property (nonatomic, strong) NSMutableDictionary *indexToHeight;
为了提高效率 不用每次都计算高度这里用字典存起来

- (void)viewDidLoad {    [super viewDidLoad];    self.tableView.dataSource = self;    self.tableView.delegate = self;    self.indexToHeight = [[NSMutableDictionary alloc] init];}

下面最重要的一步。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {        if ([self.indexToHeight objectForKey:[NSNumber numberWithInteger:indexPath.row]] == nil) {        float offset = 84;        CMessage *mes = self.mesList[indexPath.row];        UIScreen *screen = [UIScreen mainScreen];        float mesHeight = [self fontWidth:mes.text fontSize:16  width:screen.bounds.size.width - 86];        [self.indexToHeight setObject:[NSNumber numberWithInteger:offset + mesHeight] forKey:[NSString stringWithFormat:@"%ld",indexPath.row]];    }    NSNumber *num = [self.indexToHeight objectForKey:[NSString stringWithFormat:@"%ld",indexPath.row]];    return num.intValue;}- (CGFloat)fontWidth:(NSString *)src fontSize:(float)size width:(float)width {    return [src boundingRectWithSize:CGSizeMake(width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:size]} context:nil].size.height;}

上面是两个函数。第一个函数是delegate的协议。 第二个是我写的需要用的函数。

其中第二个函数可以重复使用,功能就是返回一个字符串在指定宽度下的实际高度。(包括多行的时候),然后再通过这个高度设置cell的高度

第一个函数就是传回一个自定义的高度值。 先if判断是否此行计算过高度。然后再调入字符串数据,这里是我自己的列子,里面的实际数值是我的约束,为了简单我直接写的数字。大概意思就是计算好高度后,存到字典里,下次调用就直接取字典就行了。

下面是效果图:



0 0