文档章节

IOS7环境实现自动计算TableViewCell高度的方法

 泊竹
发布于 2015/05/19 09:07
字数 531
阅读 2517
收藏 0

Autolayout规则:view的frame受约束的控制。约束可以直接影响自身的frame,也可以影响其他View的frame。

我的推测:subView与superView的某条边有强约束(固定值的约束),当superView本身对这条边没有设置约束,会以subView的约束为准。

试验:

1、自定义一个Cell,拖一个label。设置cell的上下边与Cell.contentView间距0,其他约束随意。这样,lable对Cell的高度有了一个强约束。设置label的行数为0,高度不设。

2、感谢网友提醒,这里如果是iOS7,还是需要设置Cell的高度,不过可以非常简化,具体做法如下:

a、在ViewController中创建一个Cell的属性或成员变量,专门用于计算Cell高度。(做这一步是为了性能优化)比如self.tempCell

b、改写计算高度的回调

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id entity = self.dataSourceArray[indexPath.row];
    if (self.tempCell == nil) {
        self.tempCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    }
    self.tempCell.bounds = CGRectMake(0,
                                      0,
                                      CGRectGetWidth(self.tableView.bounds),
                                      CGRectGetHeight(self.tempCell.bounds)
                                      );
    [self.tempCell resetCellWithEntity:entity];
        
    CGFloat height = [self.tempCell systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
    return height > 44 ? height : 44;
}

self.tempCell.bounds = xxxxxx

写这行是因为tempCell创建出来后,默认宽度不一定符合实际情况。

c、在tempCell的resetCellWithEntity:方法中,加入类似这样的代码:

self.testLable.preferredMaxLayoutWidth = self.frame.size.width;

这是因为UILable根据preferredMaxLayoutWidth的值计算高度。默认不设置,表示由系统自动计算。但自动计算仅在iOS8以后有效。iOS7的话,还是需要手动设置的。


3、设置一个数据源,一个NSString的数组,放入长短不同的String进行测试,可以发现显示正常。



上述方法在iOS7真机上测试通过。


本次修改解决了讨论区的各位兄弟指出的错误,真正在iOS7上实现了既定目标,感谢大家。



© 著作权归作者所有

粉丝 90
博文 67
码字总数 13285
作品 0
徐汇
私信 提问
加载中

评论(8)

泊竹 博主

引用来自“萨斯辈的呼唤”的评论

楼主,这是iOS8的API,你需要做版本检测以及重绘。你可以参考一下我的博客
http://my.oschina.net/CgShare/blog/473845
非常感谢你的研究,对我很有启发
萨斯辈的呼唤
萨斯辈的呼唤
楼主,这是iOS8的API,你需要做版本检测以及重绘。你可以参考一下我的博客
http://my.oschina.net/CgShare/blog/473845
泊竹 博主
现在都是这样做的
ParsifalC
ParsifalC

引用来自“泊竹”的评论

非常可惜啊,就差一点点。只有等最低支持的版本号升到iOS8了。
有个API可以用(systemLayoutSizeFittingSize:)这个。孙源这个库挺好的。也是用这个API计算的。https://github.com/forkingdog/UITableView-FDTemplateLayoutCell
泊竹 博主
非常可惜啊,就差一点点。只有等最低支持的版本号升到iOS8了。
泊竹 博主
这篇博客确实有问题,在iOS7下不能成功。非常感谢指正79
ParsifalC
ParsifalC
简单试了一下 iOS7下 确实不行 建议楼主把sample code放上来。83
ParsifalC
ParsifalC
这个依旧是利用了iOS8的Self Sizing Cells特性吧,iOS7下应该是不行的。你的模拟器用的8.3的6.
iOS开发中行高灵活可变的UITableView的性能优化

iOS开发中行高灵活可变的UITableView的性能优化 一、UITableView的构建原理 在新闻类,电商类等应用中,应用着大量的图文混排视图,在表视图UITableView中,开发者通常需要在如下代理方法中计...

珲少
2016/08/27
2.4K
6
IOS TableView的Cell高度自适应,UILabel自动换行适应

项目的源码下载地址:http://download.csdn.net/detail/swingpyzf/6835365 需求: 1、表格里的UILable要求自动换行 2、创建的tableViewCell的高度会自动适应内容的高度 一、用xcode构建项目,...

嘻哈开发者
2014/10/14
24.5K
0
iOS AutoLayout进阶(五)UITableViewCell自动高度

前言 前面几个章节详细介绍了Aspect Ratio、Content Hugging Priority(抗拉伸优先级)和Content Compression Resistance Priority(抗压缩优先级), 本文将综合运用这些特性,在不计算UITableVi...

朱晓辉
2017/11/27
0
0
IOS 列表行高的自动计算 解决开发中痛点

UITableView一直是我们app中使用频率最高的控件。UITableViewCell的算高问题也一直是一个老生常谈的问题。我们一般算高都是将cell中得各个控件的高度计算出来,然后给外界抛出一个接口,用来...

人独立
2015/10/13
2.5K
0
iOS 实现输入框跟随键盘自动上移

场景还原 有些时候在包含输入框的页面中,点击输入框输入会因键盘弹起而遮挡住一部分输入框,影响用户体验。iOS在默认情况下并不会处理这种问题,不过我们可以自己实现键盘弹起输入框自动上移...

还是不够辣
2017/04/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

2684亿!阿里CTO张建锋:不是任何一朵云都撑得住双11

“不是任何一朵云都能撑住这个流量。中国有两朵云,一朵是阿里云,一朵叫其他云。”11月11日晚,阿里巴巴集团CTO张建锋表示,“阿里云不一样,10年前我们从第一行代码写起,构建了中国唯一自...

阿里云官方博客
29分钟前
6
0
Spark自定义外部数据源

背景:有时候我们需要定义一个外部数据源,然后用spark sql的方式来处理。这样的好处有2点: (1)定义了外部数据源后,用起来很简洁,软件架构清晰,通过sql方式直接使用。 (2)容易分层分...

守望者之父
31分钟前
7
0
电磁兼容不应空论 越实践越知深浅

在电子行业中,电子工程师极为熟悉的就是EMC电磁兼容性测试的各项规范。其实大多工程师所了解的电磁兼容性一般来说就是:设备或系统在其电磁环境中能正常工作,且不对该环境中任何事物构成不...

demyar
32分钟前
5
0
16、SpringMVC拦截器

拦截定义 定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。 public class HandlerInterceptor1 implements HandlerInterceptor{ public boolean preHandle(HttpServletR......

快乐的瓶子
32分钟前
4
0
顺时针打印矩阵

public class Code_06_PrintMatrixSpiralOrder {public static void spiralOrderPrint(int[][] matrix) {int tR = 0; //左上角的行int tC = 0; //左上角的列int dR = ma......

Garphy
34分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部