zoukankan      html  css  js  c++  java
  • UITableViewCell高度自适应的关键点

    iOS开发中对于UITableViewCell高度自适应的文章已经很多很多,但如果cell内容比较复杂,刚使用autolayout配置自使用时还是总不能一次性成功。

    KEY POINT

    这里只说设置的关键一点:

    Cell内部的Constraints一定要有一条从Cell顶部到底部的一条可联通线。

    图例列表:


    Paste_Image.png

    Paste_Image.png

    Paste_Image.png

    最后顶部元素居上和底部元素距底部,加上约束即可。
    这条线上可以有固定高度的元素,可以有自适应高度的元素,但要保证:

    设置自适应高度的元素都在这条线上。

    当然如果在同一水平上有两个需要自适应高度的元素,就有择其一了。

    OTHER POINTS

    其他注意要点:

    1. 确保在设置约束之前,UITableViewCellsize inspector里面 Row HeightDefault而不是custom的数值,否则之后不管你如何操作,UITableViewCell优先使用的都是custom的数值。

      Paste_Image.png
    2. 注意语句.
      _tableView.estimatedRowHeight=44.0;
      如果没有这一行,依然无法自动布局。
    3. 注意设置自适应高度Label lines0
      人总是容易忽略最简单的问题。

    Paste_Image.png

    LAST

    最后在代码文件中,添加代码:
    iOS8
    使用iOS8新出的方法:

    self.tableView.estimatedRowHeight=44;
    self.tableView.rowHeight=UITableViewAutomaticDimension;

    iOS7
    (就让iOS7丢弃在历史中吧。)
    ios中没有UITableViewAutomaticDimension自动计算高度,就只能自己去计算了。
    ios7中需要一个辅助cell,cell的内容和UITableView的内容一致,但不用于显示,而是用于根据填充的内容计算每个cell的高度。

    @property (strong,nonatomic) AdaptionCell *adaptionCell;
    //-(void)viewDidLoad 这里为什么不能使用[tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]设置一个cell。因为这会导致cell被创建了但是又未曾被tableView:cellForRowAtIndexPath:方法返回,会造成内存泄露。
    self.adaptionCell = [cellNib instantiateWithOwner:nil options:nil][0];
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
     self.adaptionCell.contentLabel.text=self.dataArray[indexPath.row%2];
        [self.adaptionCell layoutIfNeeded];
        CGFloat height = [self.adaptionCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
        return height+1;
    }

    这里为什么要+1,因为UITableViewCell有个边缘线,比其ContentView高1(其实应该是0.5)

    上面的方法里使用的一个函数systemLayoutSizeFittingSize获取contentView的size,最终得到一个自适应后的height。

    但这里有个问题---为什么这个方法得到了一个自适应的height,而不一个自适应的Width!
    所以应该有个地方来限定Width,使得Cell的内容的填充是在纵向上,而不是横向。

    //  AdaptionCell.m
    - (void)layoutSubviews{
        [super layoutSubviews];
        [self.contentView layoutIfNeeded];
        self.contentLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.contentLabel.frame);
    }

    LAST LAST

    最后的最后,附上结果图:


    Paste_Image.png

    和一个问题:
    如果cell中需要自适应高度的文本是富文本,是否还可以使用autolayout做自适应?
    简单的UILabel attributedText可以通过



    作者:Seas
    链接:http://www.jianshu.com/p/386b792054b1
    來源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    Chandy-Lamport_algorithm
    3 differences between Savepoints and Checkpoints in Apache Flink
    列数 行数 表数 限制
    数据收集、传输、元数据管理、作业流调度、海量数据查询引擎、数据可视化
    分析云负载均衡产品
    端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
    JSON Web Token
    查看开启端口的应用
    If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r
    微服务架构的理论基础
  • 原文地址:https://www.cnblogs.com/SUPER-F/p/7298368.html
Copyright © 2011-2022 走看看