检测到约束模糊地表示高度为零的情况

Dav*_*d E 109 xcode objective-c uitableview ios swift

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

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.
Run Code Online (Sandbox Code Playgroud)

之前,当我在这个项目上使用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.
Run Code Online (Sandbox Code Playgroud)

我也阅读了所有类似的主题,但他们的解决方案都没有帮助.当我使用模拟器测试应用程序时,应用程序运行正常,除了应该在tableView单元格中的图片不存在.

Woo*_*ter 202

您在iOS8的表格视图中遇到了一个梦幻般的新功能的副作用:自动行高度.

在iOS 7中,您要么拥有固定大小的行(设置为tableView.rowHeight),要么您编写代码来计算单元格的高度,然后将其返回tableView:heightForRowAtIndexPath.编写用于计算单元格高度的代码可能非常复杂,如果您的单元格中有许多视图,并且您在不同的字体大小上有不同的高度.添加动态类型,这个过程很麻烦.

在iOS 8中,您仍然可以执行上述操作,但现在可以通过iOS确定行的高度,前提是您已使用"自动布局"配置了单元格的内容.这对开发人员来说是一个巨大的好处,因为随着动态字体大小的变化,或者用户使用"辅助功能设置"修改文本大小,您的UI可以适应新的大小.这也意味着如果你有一个可以有多行文本的UILabel,你的单元格现在可以增长以适应单元格所需的那些,并且当它不需要时缩小,所以没有任何不必要的空格.

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

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

布局传递的工作方式如下,这是在一个单元格在屏幕上显示之前,以及时的方式发生的:

  1. 计算具有固有尺寸的内容的尺寸.这包括UILabels和UIImageViews,它们的尺寸分别基于它们包含的文本或UIImages.这两个视图都会认为它们的宽度是已知的(因为您为尾随/前沿设置了约束,或者您设置了显式宽度,或者您使用了最终从一侧到另一侧显示宽度的水平约束).假设一个标签有一段文字("行数"设置为0,所以它将自动换行),它只能是310点,所以它确定在当前字体大小为120pt高.

  2. UI根据您的定位约束进行布局.标签底部有一个连接到单元格底部边距的约束.由于标签已经增长到120点高,并且由于它通过约束被绑定到单元格的底部,因此必须将单元"向下"(增加单元的高度)以满足"底部"的约束.标签始终与细胞底部的标准距离.

如果缺少底部约束,则会报告您报告的错误消息,在这种情况下,没有任何东西可以"推动"单元格的底部远离单元格的顶部,这是报告的模糊性:没有任何东西可以推动底部顶部,细胞坍塌.但是,自动布局也会检测到这一点,并且会回退到使用标准行高.

对于它的价值,并且主要是为了得到一个全面的答案,如果你实现iOS 8的基于Auto Layout的动态行高,你应该实现tableView:estimatedHeightForRowAtIndexPath:.该估计方法可以使用单元格的粗略值,并且在最初加载表视图时将调用它.它帮助UIKit绘制滚动条之类的东西,除非tableview知道它可以滚动多少内容,但不需要绘制,但不需要完全准确的大小,因为它只是一个滚动条.这使得实际行高的计算可以延迟到需要单元格的时刻,这样计算量更小,并且可以更快地呈现UITableView.

  • 就像伍德斯特所说的那样,我确实错过了.Bottom部分约束.添加后,我的问题得到了解决. (4认同)
  • 这是对此警告的根本原因的一个很好的解释.伍德斯特,你的时间很多! (3认同)

Vik*_*era 114

到目前为止,有三件事已经成功地使这一警告沉默 你可以找到最方便的.没什么好看的.

奇怪的.

  • 这是因为如果你在IB中保留44pt的值,它会认为你想要使用自定尺寸单元格./sf/ask/1812168851/#25888127(但是,是的,这确实是一种奇怪的行为) (4认同)

Anc*_*nia 9

要在没有编程方法的情况下解决此问题,请从故事板中调整"大小"检查器中的表视图的行高.

在此输入图像描述


ABa*_*ith 9

创建自定义UITableViewCell并将我的子视图添加到单元格而不是它的后,我遇到了这个问题contentView.


Jac*_*ack 6

只需启用自调整表格视图单元格

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension
Run Code Online (Sandbox Code Playgroud)

并确保您在UITableViewCellas- 的所有方面都添加了约束-

在此处输入图片说明


hum*_*rim 5

我今天收到这个警告。这就是它对我来说消失的原因(在界面生成器中)

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

我不必对代码进行任何更改


小智 5

这是一个自动布局问题。确保子视图具有所有约束。对我而言,缺少单元格中“标题标签”的底部约束。当我添加这些内容时,警告消失了,一切都完美显示了。


小智 5

如果您使用的是静态单元格或动态单元格,只需在检查器表的表视图中添加一些行高,然后在行高的右侧取消选中自动行,则您将停止收到此警告。在此处输入图片说明