检测到一个约束条件含糊不清的情况

在更新到Xcode 6.1 beta 2后,当我运行包含tableview单元格的应用程序时,debugging助手说:

Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead. 

之前,当我在这个项目上使用Xcode 5的时候,我会遇到一些错误,但是升级之后,这些错误就消失了。 我现在没有其他的错误或警告。 我已经尝试调整所有tableview单元格的大小,也尝试使用标准高度,但我仍然得到相同的警告:

 Warning once only: Detected a case where constraints ambiguously suggest a height of zero for a tableview cell's content view. We're considering the collapse unintentional and using standard height instead. 

我也阅读了所有类似的话题,但是他们的解决scheme都没有帮助。 当我用模拟器testing应用程序时,应用程序运行良好,除了应该在tableView单元格中的图片不在那里。

到目前为止,有三件事已经设法使这个警告消失。 你可以拿起最方便的你。 没有什么漂亮的。

  • 在viewDidLoad中设置默认单元格的高度

     self.tableView.rowHeight = 44; 
  • 转到故事板,并将您的tableview上的行高改为44以外的东西。

  • 实现tableview的委托方法heightForRowAtIndexPath

     - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44; } 

奇怪的。

在iOS8的桌面视图中遇到了一个奇妙的新function的副作用:自动行高。

在iOS 7中,您可以使用固定大小的行(使用tableView.rowHeight设置),也可以编写代码来计算单元格的高度,然后在tableView:heightForRowAtIndexPath中将其返回。 如果在单元格中有许多视图,并且您有不同的高度来考虑不同的字体大小,那么编写单元格高度计算的代码可能会非常复杂。 添加dynamictypes和过程是一个痛苦的屁股。

在iOS 8中,您仍然可以执行上述操作,但是现在行的高度可以由iOS来确定,前提是您已经使用“自动布局”configuration了单元格的内容。 这对于开发者来说是巨大的好处,因为随着dynamic字体大小的改变,或者用户使用辅助function设置来修改文本大小,你的UI可以适应新的大小。 这也意味着如果你有一个可以有多行文本的UILabel,你的单元现在可以增长以适应单元需要时的单元格,而当单元格不需要时,单元格可以缩小,所以没有任何不必要的空白。

您看到的警告消息告诉您单元格中没有足够的约束来自动布局通知tableview单元格的高度。

要使用dynamic单元格高度,以及其他海报已经提到的技术,也将摆脱此消息,您需要确保您的单元格有足够的约束将UI项目绑定到单元格的顶部和底部 。 如果以前使用过“自动布局”,则可能习惯于设置“顶部+主导”约束,但dynamic行高也需要底部约束。

布局过程就像这样,它是在一个单元显示在屏幕上之前立即发生的:

  1. 计算内在尺寸内容的尺寸。 这包括UILabels和UIImageViews,其尺寸分别基于它们包含的文本或UIImage。 这两个视图都会考虑它们的宽度是已知的(因为您已经为后沿/前沿设置了约束,或者设置了显式宽度,或者使用了最终显示宽度的水平约束)。 假设一个标签有一段文字(“行数”设置为0,所以它会自动换行),它只能是310个点,所以在当前的字体大小下,它被确定为120pt高。

  2. 用户界面根据您的定位限制进行布局。 连接到单元格底部边界的标签底部有一个限制。 由于标签的长度已经增长到了120个点,并且由于约束将其绑定到单元格的底部,所以它必须将单元格向下推(增加单元格的高度)以满足“底部标签总是与单元格底部的标准距离。

如果底部约束丢失,则会报告错误消息,在这种情况下,没有任何操作可以将单元格的底部“推出”单元格的顶部,这是所报告的模糊性:没有任何操作可以将底部从底部顶部,细胞崩溃。 但是Auto Layout也会检测到这一点,并回退到使用标准行高。

对于什么是值得的,主要是有一个四舍五入的答案,如果你实现了iOS 8的基于自动布局的dynamic行高,你应该实现tableView:estimatedHeightForRowAtIndexPath: 该估计方法可以为您的单元格使用粗略值,并且在表视图最初加载时将被调用。 它有助于UIKit绘制滚动条等东西,除非tableview知道可以滚动多less内容,而不需要完全精确的大小,因为它只是一个滚动条。 这可以使实际行高的计算延迟到需要单元格的时刻,这是计算量较小的时间,并且可以让您的UITableView呈现得更快。

我今天得到了这个警告。 这是什么让我消失(在界面生成器)

1.将表视图的行高度字段设置为除44之外的其他值2.将tableView单元格的行高度字段设置为44以外的值

我不必在代码中进行任何更改

为了解决这个问题,没有一个编程方法,调整故事板的大小检查器中的表视图的行高。

在这里输入图像说明

创build一个自定义的UITableViewCell并添加我的子视图到单元而不是它的contentView后,我有这个问题。

这是一个自动布局问题。 确保你的子视图有所有的限制。 对于我来说,单元格中的标题标签缺less底部约束。 当我补充说,警告消失,一切都performance完美。

我也转向了Xcode 6 GM。 当我将设备旋转回原来的位置时,我只得到警告。

我正在使用自定义的UITableViewCells。 故事板表视图设置为我自定义的大小(在我的情况下是100.0)。 虽然表格单元格像以前版本中的那样正确呈现,但我不喜欢警告消息。

除了上述的想法,我补充说

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 100.0; } 

屏幕呈现…响应旋转,没有更多的警告消息。

在xcode 6.0.1中,我已经使用以下命令删除了指定行高度的警告:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44.0; } 

在故事板中,将cell Row height字段设置为与tableView Row height相同的值(两者的值都相同)。

如果将heightForRowAtIndexPath函数添加到代码中,可能会导致性能问题,因为每个单元都要调用它,所以要小心。

如果您的唯一约束条件设置为垂直alignment所有项目,并且您没有/希望为单元格指定高度,则也可能会看到此消息。 如果您对该项目设置了顶部/底部限制,警告将消失。

当我的自定义tableViewCell中的标签和视图被限制到customCell而不是其内容视图时,我遇到了这个问题。 当我清除约束并连接到单元格内容查看问题已解决。