UITableView的Autolayout错误

Mat*_*era 13 iphone ios autolayout nslayoutconstraint

我有一个TableView,我使用委托方法指定每个单元格的高度tableView:heightForRowAtIndexPath:.

当我旋转视图时,我得到了这个我不太明白的错误.

它不能满足下面的约束并打破它继续.

"<_UIScrollViewAutomaticContentSizeConstraint:0x8e8d040 UITableView:0x9423400.contentHeight{id: 213} == -1568.000000>"
Run Code Online (Sandbox Code Playgroud)

有谁知道发生了什么以及为什么我打破了这个限制?

Ric*_*ble 21

更新:此问题在iOS 8中不再相关,iOS 8增加了对自定义单元格的支持.但它仍然适用于iOS 7.

原始答案(iOS 7):

Greg的答案肯定对我有用 - 我需要调试我的tableView:estimatedHeightForRowAtIndexPath:方法.我做了一些调试和一些快速实验,这里有一些我学到的东西:

  1. 不要在估计的方法中使用UITableViewAutomaticDimension.此常量用于页眉和页脚方法.当我阅读文档时,我想我没有给予足够的重视:) 更新:UITableViewAutomaticDimension现在可以用于iOS 8中的行高,这是自定义单元格功能的一部分.

  2. 估计行高为1.0会导致异常:"NSInternalInconsistencyException",原因:'表视图行高不得为负...'"估计小于1.0也会产生奇怪的结果.

  3. 估计2.0和实际工作之间没有任何例外(尽管2.0可能是出于优化原因的不好选择 - 你希望尽可能接近实际).

  4. 约束异常仅在估计的行高大于实际行高时发生.越接近实际,异常发生的可能性就越小.在获得异常之前,您的估计距离似乎与几个不同因素有关:实际行高,行的位置等.

  • 第二种情况是直到iOS 10(包括iOS 10)为止的实际情况。它已在iOS 11中修复。一个快速示例:https://github.com/OlesyaS/UITableView-ios10-crash/blob/master/table/ViewController.m (3认同)

gre*_*reg 12

tl; dr:寻找与您估计的实际高度值完全不同的实际高度值.或者是负数或实际值.0


我只花了几分钟调试这个约束异常.我有一个UITableView单元格,节标题和节页脚.其中每个都estimatedHeightFor定义了iOS 7 消息,返回一个static const值.我一次删除了一个单元格,页眉和页脚,直到我确定问题来自页脚(如果你没有页脚,请不要重要,请继续阅读).

如果我消除了estimatedHeightForFooterInSection:,那个例外就消失了.在我看来heightForFooterInSection:,有一条路径,其中页脚的高度0.当我恢复estimatedHeight消息并消除实际高度的代码路径时0,异常也消失了.在异常重新出现之前,我将此值替换为12 0,22并将此值一直降低到12.

无论如何,我需要的页脚的高度是0(我返回nilviewForFooterInSection:在这种情况下),我希望能够估计高度(我支持动态文本).我的解决方案是考虑代码路径,这将给我一个0高度estimatedHeightForFooterInSection:.一旦我添加了,那个例外就消失了.


小智 1

尝试调试你的

(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

执行。就我而言,它在某些罕见的情况下返回负整数,导致消息显示在我的日志中并扰乱我的表视图的滚动行为。