检测到约束含糊地建议高度为零的情况

当我运行包含 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.

以前,当我在这个项目中使用 Xcode 5时,我会得到一些错误,但是自从我升级以来,这些错误已经消失了。我现在没有其他的错误或警告了。我已经尝试过调整所有桌面视图单元格的大小,也尝试过使用标准高度,但我仍然得到同样的警告:

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.

我也阅读了所有类似的主题,但没有一个解决方案有帮助。当我用模拟器测试应用程序时,应用程序运行良好,除了应该在 tableView 单元格中的图片不在。

80345 次浏览

到目前为止,有三件事情成功地让这一警告消失了。你可以选择最方便的。不过没什么好看的。

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

    self.tableView.rowHeight = 44;
    
  • Go to storyboard and change row height on your tableview to something different than 44.

  • To implement tableview's delegate method heightForRowAtIndexPath

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

Weird.

我也经历了这个移动到 Xcode 6 GM 的警告。我只是在旋转设备回到原来位置的时候才收到警告。

我正在使用自定义 UITableViewCell。故事板表视图被设置为我自定义的大小(在我的例子中是100.0)。虽然表单元格呈现正确,因为它们在以前的版本中,我不喜欢警告消息。

除了以上的想法,我补充了这一点

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

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

今天我收到了这个警告,下面是让它消失的 Interface Builder

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

我不需要对代码做任何修改

在 iOS8的 Tableviews 中,你会遇到一个奇妙的新特性的副作用: 自动行高。

在 iOS7中,要么有固定大小的行(设置为 tableView.rowHeight) ,要么编写代码来计算单元格的高度,然后在 tableView:heightForRowAtIndexPath中返回这个值。如果单元格中有许多视图,并且在不同的字体大小下需要考虑不同的高度,那么编写计算单元格高度的代码可能会非常复杂。加上动态类型和过程是一个痛苦的屁股。

在 iOS8中,您仍然可以执行上述操作,但是现在行的高度可以由 iOS 确定,前提是您已经使用 Auto Layout 配置了单元格的内容。这对于开发人员来说是一个巨大的好处,因为随着动态字体大小的变化,或者用户使用可访问性设置修改文本大小,您的 UI 可以自适应新的大小。这还意味着,如果 UILabel 可以包含多行文本,那么单元格现在可以在需要时增大以容纳这些文本,在不需要时缩小,因此不存在任何不必要的空白。

您看到的警告消息告诉您,您的单元格中没有足够的约束,因此“自动布局”无法通知表格视图单元格的高度。

为了使用动态单元格高度,以及其他海报已经提到的技术,也将摆脱这个消息,您需要确保您的单元格有足够的约束来将 UI 项绑定到单元格的顶部 和底部。如果您以前使用过 Auto Layout,那么您可能已经习惯于设置 Top + Leadership 约束,但是动态行高也需要底部约束。

布局传递的工作原理是这样的,它在单元格显示在屏幕上之前立即发生,以及时的方式:

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

  2. UI 根据您的定位约束进行布局。在标签的底部有一个约束,该约束连接到单元格的底部边距。因为标签已经长到120点高,而且因为它被约束绑定到单元格的底部,所以它必须向下推单元格(增加单元格的高度)以满足约束,即“标签的底部始终是与单元格底部的标准距离。

您报告的错误消息发生在缺少底部约束的情况下,在这种情况下,没有任何东西可以“推”单元格的底部离开单元格的顶部,这就是报告的模糊性: 没有任何东西可以推动底部离开顶部,单元格就会崩溃。但是自动布局也检测到了这一点,因此回到使用标准行高。

不管怎样,如果你真的实现了 iOS8的基于自动布局的动态行高,你应该实现 tableView:estimatedHeightForRowAtIndexPath:。该估计方法可以对单元格使用粗略值,并且在最初加载表视图时调用它。它帮助 UIKit 绘制滚动条之类的东西,除非表视图知道它可以滚动多少内容,否则无法绘制滚动条,但它不需要完全准确的大小,因为它只是一个滚动条。这样可以将实际行高的计算推迟到需要单元格的时候,这样计算量较小,并且可以更快地显示 UITableView。

在 xcode 6.0.1中,我使用以下方法删除了指定行高的警告:

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

要在不使用编程方法的情况下解决这个问题,可以调整情节串连板的 Size spector 中表视图的行高。

enter image description here

这是自动布局问题。确保您的子视图具有所有的约束条件。对于我来说,单元格中的 Title Label 缺少底部约束。当我加上这个,警告消失了,一切都显示得很完美。

在情节串连图板中,设置 cell Row height字段的值与 tableView中的 Row height相同(两者的值对我来说都是相同的)。

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

我有这个问题后,创建一个自定义的 UITableViewCell和添加我的子视图的单元格,而不是它的 contentView

如果仅仅将约束设置为垂直对齐所有项,并且没有/想要为单元格指定高度,则可能还会看到此消息。如果在项上设置顶部/底部约束,警告将消失。

当我在自定义 tableViewCell 中的标签和视图被限制到 customCell 而不是它的 Content View 时,我遇到了这个问题。当我清除约束并将它们连接到单元格 Content View 时,问题就解决了。

我收到了同样的错误消息, 确保所有的出口都是有效的,比如表格视图和表格视图约束

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

   tableView.estimatedRowHeight = 85.0
tableView.rowHeight = UITableViewAutomaticDimension

& 请确保在 UITableViewCell的所有方面添加约束为-

enter image description here

如果您使用的是静态单元格或动态单元格,只需在检查表中的表格视图中添加一些行高,然后取消选中行高右侧的自动选项,那么您将停止获得此警告。enter image description here

在我的例子中,我正在以编程方式构建单元格并不断得到这个错误。

我在 UITableViewCellinit方法中添加了这样的子视图和约束:

addSubview(rankingLabel)
addConstraints(cellConstraints)

我把它们加入到细胞的 contentView中,解决了这个问题:

contentView.addSubview(rankingLabel)
contentView.addConstraints(cellConstraints)

将估计的行高设置为零,警告就会消失:

enter image description here

我有相同的错误,由于这一行,这个错误被显示。

Color = UIColor (white: 1,alpha: 0.2) as! CGColor

我只是修改了下面的代码行来修复这个错误

Color = UIColor (white: 1,alpha: 0.2) . cgColor

如果已经为 tableView 创建了自定义 tableViewCell,请确保已经为单元格提供了底部和顶部约束, 如果你在自定义单元格中的子视图是 在 Y 中心对齐,那么你也可以得到这个消息,它不会弹出任何错误消息,但是会扰乱表格视图的行高识别,而这又会导致错误消息的出现。 < a href = “ https://i.stack.imgur.com/aNE73.png”rel = “ nofollow noReferrer”> 就像我附加的图片一样,这里我们有顶部和底部的约束

为 tableView 创建自定义单元格时,必须为单元格内自定义单元格的子视图指定行高或顶部和底部约束(例如,下图中的自定义单元格中的标签)

但是如果这不起作用,您可以尝试为您的单元格设置行高度,而不是自动 就像这张照片里一样

但是,如果您关闭自动勾选,您必须调整您的行大小的变化,这可能是自动进行的编程

如果要进行动态高度计算,

  • 您应该将所有元素按照诸如顶部和底部之类的约束相互链接。
  • 您肯定应该有一个与单元格底部的元素链接的 底部约束

对于具有动态行高的自定义 tableview 单元格,我也有类似的问题。动态高度没有反映,并在控制台得到相同的警告。解决方案是将子视图添加到单元格而不是 contentView。顺便说一下,我已经用编程方式创建了子视图。

我在 TableViewCell中遇到了这个问题,在初始化时设置了约束,但是在之后加载单元格的内容时,这意味着自动布局引擎无法确定高度。这里的其他解决方案不起作用,因为我需要细胞的高度是 UITableView.automaticDimension

我刚刚在单元格中添加了一个额外的约束:

contentView.heightAnchor.constraint(equalToConstant: 44, priority: .defaultLow)

我今天收到了这个警告,我所做的只是在代码中多加了一行

tableView.rowHeight = 200;

将此行代码添加到

func tableView(_ tableView: UITableView, numberOfRowsInSection section:Int) -> Int {
...
}

最后的代码看起来像

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
tableView.rowHeight = 200;
...
}

此代码将表 Row 单元格高度增加到200,默认高度为44

如果你使用 UITableView 来扩展 ViewController 类,同时也使用导航控制器来显示屏幕,那么你就不需要执行与标识符的连接,这可能会导致标识符 ViewController 的错误,你可以使用 pushViewController 方法来显示聊天屏幕,以摆脱这个错误,所以这里的代码只是把它粘贴到你的 UITableView 委托

Let chatBox = ChatBoxViewController () 导航控制器? . pushViewController (chatBox,动画: true)

只需要输入你想要显示的视图控制器的名称,然后就完成了。