你的位置:首页 > 操作系统

[操作系统]xib动态改变cell行高


布局如下

 

共3个控件,一个头像,一个背景,一个message

现在当输入多行文字时希望cell动态的调整行高

那么首先头像的高度肯定是不希望改变的,所以头像的宽度是有contentview的宽度来决定的,它的高得1:1(其他的也可以)取决于它的宽度,这样contnetview高度变化时就不会影响头像大高度

然后设置uilabel多行显示有些许不同

参考

XIB下UILabel的自动换行(可动态换行以及调整高度)

使用Autolayout实现UITableView的Cell动态布局和高度动态改变(这是翻译)

Using Auto Layout in UITableView for dynamic cell layouts & variable row heights(这是原文)

根据上面的建议知道,创建cell会预先多次调用

-(CGFloat)tableView:(nonnull UITableView *)tableViewheightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath

用以创建cell,那么如何在创建前就设置好高度就相当重要了

如果是纯代码的话,一般这么处理

首先创建cell之前先行获取到数据源,然后数据源根据cell索引查找到该条数据,然后处理该条数据获得高度在heightForRow里进行返还即可

-(CGFloat)tableView:(nonnull UITableView *)tableViewheightForRowAtIndexPath:(nonnull NSIndexPath *)indexPath{  NSString* string=dataSource.nsArrayModels[indexPath.row];  CGSize size=[string boundingRectWithSize:CGSizeMake(tableView.frame.size.width, MAXFLOAT)             options:NSStringDrawingUsesLineFragmentOrigin                 attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:12.f],NSBackgroundColorAttributeName:[UIColor yellowColor]}             context:nil].size;  return size.height;}

如果是纯文本的信息还好处理,一旦数据样式多变就比较麻烦了,而且这里面的属性配置

@{NSFontAttributeName:[UIFont systemFontOfSize:12.f],NSBackgroundColorAttributeName:[UIColor yellowColor]

是以xib中的为准的,就是此处无效(那为什么要写?万一要代码写忘记就麻烦了)

使用xib自适应的话

首先如何设置高度

  //开启估算行高根据内容动态的修改cell高度  self.tableview0.estimatedRowHeight=20.f;  self.tableview0.rowHeight=UITableViewAutomaticDimension;

是的,采用系统提供的行高估算方法来获取一个临时的cell高度,当cell真正的依靠约束改变高度时并创建完成时就会自动的替换高度了

那么约束改变行高的关键是

 确保每个子视图垂直方向上的内容压缩阻力(compression resistance)和吸附性约束(hugging constraints)没有被你添加的更高优先级的约束条件覆盖,让这些子视图的固有内容尺寸(intrinsic content size)来驱动contentView的高度。

依靠内容驱动,而且是最高优先级(至少在改变高度这件事上)注意内容驱动的话代表的是所有的直接可以影响到contentview高度的控件,这里的话都会影响到,如果背景图的像素高一开始足够大或者等于了cell的高度都会应影响的,头像同理,为了保持文字完全显示在背景上所以背景的高度是由message来的驱动的

自带的表情可以直接显示还真是意外

宽度的好像没做。。。。。。。。。