iOS8 – 限制含糊地表明高度为零
有没有人有任何想法如何debugging呢?
只警告一次:检测到一个约束不明确地build议tableview单元格的内容视图的高度为零的情况。 我们正在考虑无意的崩溃,并使用标准高度来代替。
这些行具有固定的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 34.0; }
所有的constraints
似乎都很快乐
强制返回的高度和估计的高度使警告在我的情况下消失。
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; }
另一个不需要两个覆盖的解决scheme就是使用self.tableView.rowHeight = 44;
在你的loadView
或init方法中。
还可以做的是从内容视图的顶部到底部添加垂直约束。 这将使自动布局快乐(因为他现在知道如何计算自己的细胞高度)。
如果你使用autoLayout约束和UITableViewAutomaticDimension,这个错误不是一些错误的问题,通过覆盖代码中的高度而被丢弃。 这意味着自动确定单元格高度不起作用,因为您没有适当的垂直约束条件。
如果你像我一样,得到这个错误,并需要帮助确定哪个单元格抛出错误,你可以在返回'heightforRowAtIndexPath'方法之前添加以下行。
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
这将打印出一长串部分和行,但错误会立即出现在导致错误的特定单元格之后,并且您可以快速识别哪个单元格导致问题并相应地修复您的约束。 这对于静态单元尤其有用。 如果您不使用autoLayout和自动单元格高度,则使用手动input的数字覆盖高度将会起作用,但如果您正在尝试使用某些function,则会从根本上禁用这些function,这是非常糟糕的解决scheme。
如果您之前没有使用'heightForRowAtIndexPath'方法,但想要在不撤销UITableViewAutomaticDimension设置的情况下debugging此错误,只需将其添加到代码中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]); return UITableViewAutomaticDimension; }
如果使用自动布局,并且您没有为每个表视图单元格指定行高度的值,而是保留“默认”值,则XCode 6.1中会出现一个导致此问题的错误。 只需检查行高的旁边的“自定义”checkbox,对于每个单元格,都会使警告消失。
是的,即使在对表格视图单元格中的项目只有水平约束的情况下,您也会得到所有的约束“高兴”。 我有同样的问题。 您还需要添加垂直约束。 这样做,这个警告就会消失。
约束条件可以为布局的目的而感到高兴,但对于自动行高度的目的不是很满意。 一个愉快的布局意味着内容可以毫不含糊地排列。 这将满足Interface Builder中的检查。
自动行高度的快乐布局意味着,除了上述之外,还包括对单元格底部的约束。
更多在这里: 检测到一个约束含糊地暗示高度为零的情况
我在表视图大小检查器中使用行高度43(或<> 44),错误消失。 使用44我得到错误。 Xcode版本6.0.1。
– 这个答案已被版主删除,请不要,它修复了这个问题。 这解决了我的问题,也可能为别人做。 所以,你可以如此友善,不要再删除它。
我无法去除警告,但为了使约束工作,我设置了新的iOS8,tableview属性estimatedRowHeight
到固定高度,并删除了heightForRowAtIndexPath
实现。
如果你得到这个警告,很可能是因为你正在使用自动布局,而你的单元格里面没有任何约束。
您应该停止使用自动布局或实现明确定义单元格高度的约束。
您可以通过取消选中右侧文件检查器中的“使用Autolayout”选项来closures界面构build器中的自动布局。
如果您select使用自动布局,并且您的单元格的高度是固定的,那么实现适当的约束应该很容易。 只需为单元格内容视图的子视图添加高度约束,并在子视图之间以及子视图和内容视图之间实现垂直空间约束。 例如,如果您的单元格中有一个标签,这将工作:
垂直约束
- 内容视图顶部和标签顶部之间的垂直空间约束
- 固定标签的高度限制
- 标签底部和内容视图底部之间的垂直空间约束
水平限制
- 内容视图的前沿与标签的前沿之间的水平空间约束
- 固定的标签宽度限制
- 标签后边缘和内容视图后边缘之间的水平空间约束
你可以使用AutoLayout为你计算正确的高度。 这里有一个关于iOS 8dynamic单元格高度的好消息: http : //natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
在Swift强制返回高度解决了我的问题:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { if(indexPath.row == 0){ return CGFloat(131.0) }else if(indexPath.row == 8){ return CGFloat(97.0) }else{ return CGFloat(44.0) } }
对于一个沼泽标准修复,没有约束,没有估计高度,或过度devise的问题。 我创build了一个默认项目,连接了tableview,但忘了把高度委托放在视图控制器 。 为了简单地使这个警告消失,你需要这个。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ return 44; }
在你的表格的视图控制器。
我正在使用uitableviewcell里面的mapView。 我将地图视图的高度更改为设备屏幕大小的三分之一。 我得到了同样的错误。 我通过向uitableviewcell的内容视图添加缺less的约束来修复错误。
1)清除contentView约束。
2)设置重置为build议常量contentView。
3)添加缺less的约束 – 如果有的话
4)我们确保内容视图具有所有必需的约束。
在我的情况下,这是因为我用xibdevise单元格,而我忘记将xib文件添加到目标。
在将xib文件添加到目标后,问题消失了
尽pipe本页上的答案讨论了在heightForRowAtIndexPath中添加高度约束或手动返回像44这样的rowHeights会导致警告消失,但它们是多余的,因为这是至less在版本6.3.2(6D2105)中可见的Xcode中的错误 。
如果在viewDidLoad中设置断点,则即使在故事板中指定行高度为44,也会看到self.tableView.rowHeight = -1(UITableViewAutomaticDimension)。 这是因为,如果将行高保留为44,则Apple错误地假定您需要dynamic行高,因为它们没有提供标志来指定您的偏好。
以下是一些可能的解决scheme及其结果:
-
在故事板(作品)中将行高设置为43或45。
-
在heightForRowAtIndexPath(works)中手动返回44的高度。
-
在UITableViewCell的元素和其contentView(工程)之间添加高度约束。
不幸的是,这些解决scheme要求您更改devise,添加不必要的约束或添加不必要的代码来解决错误。 我试过(我认为是)最简单的解决scheme:
- 在故事板中将每个UITableViewCell的高度设置为44(自定义)(失败)。
我真的想要一个纯粹的故事板解决scheme,所以最后我试了一下:
- 将一个用户定义的运行时属性添加到故事板中的UITableView中,并使用关于如何设置rowHeight的备注来命名UITableView,以便将来的开发人员可以find它:(works):

这些错误在iOS开发中过于常见,并迫使开发人员花费过多时间来衡量其解决scheme将长期影响可维护性的后果。
因为find一个可维护且似乎没有被混淆的概念上正确的解决scheme是非常难以捉摸的,并且假设苹果将修复该错误并且将在可预见的将来成为默认行高,那么约束或用户定义运行时属性解决scheme可能是最容易维护的。
在这里发生了两件重要的事情,我想。
1)如果您按Ctrl +拖动,使约束错误是非常容易的。 所以,仔细检查你是否正确完成了。 最好使用屏幕左侧的托盘来绘制这些限制条件。
2)而不是在ViewDidLoad或其他地方指定estimatedRowHeight,使用委托方法
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}
这就立即解决了我的问题。
使用通用故事板或xib时,我也看到了这个错误。 如果您忽略为Any x Any size类指定适当的约束条件,则会看到此错误出现。
苹果似乎已经修复了这个iOS9。 这个错误只发生在8.4。