检测到约束不明确地提示高度为零的情况


120

当我运行包含表视图单元的应用程序时,更新到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时,会遇到一些错误,但是自升级以来,这些错误已经消失了。我现在没有其他错误或警告。我已经尝试过调整所有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.

我还阅读了所有与此类似的主题,但是它们的解决方案都无济于事。当我使用模拟器测试该应用程序时,该应用程序运行正常,但不存在应该位于tableView单元格中的图片。


2
我在收集视图单元格中遇到相同的错误。我为此做些什么。有什么建议。
python

也许您应该检查是否已将xib文件添加到目标stackoverflow.com/a/26870331/1418457
onmyway133 2014年


这在iOS 8.1上发生了,但在iOS 8.4上不再发生。如果您确实指定了高度,我想那只是Xcode的错误。
samwize

Answers:


126

到目前为止,三件事已使该警告保持沉默。您可以选择最方便的方式。没什么好看的。

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

    self.tableView.rowHeight = 44;
  • 转到情节提要,并将表视图上的行高更改为不同于44的高度。

  • 实现表视图的委托方法heightForRowAtIndexPath

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

奇怪的。


我也尝试过使用您的方法,但是我需要为rowHeight添加一个@property,但是我不知道要使用的正确对象类型
David E

我可能没有收到您的笔记,但rowHeight是UITableView的属性。只需将您的桌子连接到某个插座即可。
Viktor Kucera 2014年

4
这是因为,如果将44pt值保留在IB中,它将认为您要使用自定义大小的单元格。stackoverflow.com/questions/25888126/…(但是,是的,这的确是一种奇怪的行为)
Guillaume Algis 2014年

因此,显然我有两个viewDidLoad方法,而我却把方法放self.tableView.rowHeight = 44;错了。错误消失了!谢谢
David E

感谢Guillaume Algis使其更加清晰。虽然它仍然非常令人毛骨悚然。
Viktor Kucera 2014年

216

您正在iOS8的Tableviews中遇到一个奇妙的新功能的副作用:自动行高。

在iOS 7中,您要么拥有固定大小的行(设置为tableView.rowHeight),要么编写代码以计算单元格的高度,然后将其返回tableView:heightForRowAtIndexPath。如果您在单元格中有许多视图并且在不同字体大小下需要考虑不同的高度,那么编写用于计算单元格高度的代码可能会非常复杂。添加“动态类型”后,整个过程变得很痛苦。

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

您看到的警告消息告诉您,单元格中没有足够的约束来使自动版式通知表格视图单元格的高度。

要使用动态单元格高度(它与其他发布者已经提到的技术一起使用)也将摆脱此消息,您需要确保您的单元格具有足够的约束来将UI项绑定到单元格的顶部和底部。如果您以前使用过“自动布局”,则可能习惯于设置“顶部+前导”约束,但是动态行高还需要底部约束。

布局遍历是这样工作的,它以即时的方式立即在屏幕上显示单元之前发生:

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

  2. 用户界面根据您的定位限制进行布局。标签底部有一个约束,该约束连接到单元格的底部边缘。由于标签的高度已增加到120点,并且由于约束已绑定到单元格的底部,因此标签必须“向下”推动单元格(增加单元格的高度),以满足表示“底部”的约束。标签始终是与单元格底部的标准距离。

如果缺少该底部约束,则会发生您报告的错误消息,在这种情况下,没有什么可“推”该单元格的底部使其远离该单元格的顶部,这是所报告的歧义:没有东西可将底部推离顶部,单元崩溃。但是“自动版式”也会检测到这一点,并退回到使用标准行高。

对于它的价值,并且通常需要一个综合的答案,如果您确实实现了iOS 8的基于Auto Layout的动态行高,则应该实现tableView:estimatedHeightForRowAtIndexPath:。该估计方法可以为您的单元格使用粗略值,并且在最初加载表格视图时会调用它。它可以帮助UIKit绘制滚动条之类的东西,除非表视图知道它可以滚动多少内容,否则它就无法绘制,因为它只是滚动条,因此不需要完全准确的大小。这样就可以将实际行高的计算推迟到需要该单元格的那一刻为止,这将减少计算强度,并可以更快地显示UITableView。


3
这很好地解释了此警告的根本原因。谢谢你,伍德斯特!
Golden Thumb

4
就像伍德斯特所说的,我确实错过了约束的.Bottom部分。当添加我的问题得到解决。
Golden Thumb

在尝试了将近20件事之后,这是唯一可行的方法!
Julio Rodrigues 2014年

这个男人钉了它!他应得并支持,这必须是公认的答案。+1
加勒比海2015年

1
请参阅此答案stackoverflow.com/a/29565073/4080860,以找出缺少约束的单元格。
hhanesand

11

创建自定义UITableViewCell并将子视图添加到单元而不是单元后,出现了这个问题contentView


10

若要在不使用编程方法的情况下解决此问题,请从情节提要中调整“大小”检查器中表格视图的行高。

在此处输入图片说明


对我来说最好的解决方案,因为使用情节提要替代代码行。
zyc

6

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


不知道为什么这会被否决,因为这是一个很好的答案。参见此处以获取有关找出哪个单元存在布局问题的帮助stackoverflow.com/a/29565073/4080860
hhanesand 2015年

5

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

   tableView.estimatedRowHeight = 85.0
   tableView.rowHeight = UITableViewAutomaticDimension

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

在此处输入图片说明


实际上,当我禁用自折叠表格单元格时,警告消失了。
turingtest

@turingtested您应该启用自动调整大小的tableview单元以在各种设备上提供支持。
杰克

同意,但请阅读原始问题。我的意思是您建议的解决方案不起作用,至少对我而言不起作用。
turingtest

FYI UITableViewAutomaticDimension已重命名为UITableView.automaticDimension
atineoSE

5

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


我发现相反的做法更有效:设置一个明确的估计高度,并让行高度本身是自动的。
NRitH

4

我今天得到这个警告。这就是让我消失的原因(在界面生成器中)

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

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


3

以我为例,我正在以编程方式构建单元并不断收到此错误。

我将在子视图和约束UITableViewCellinit这样的方法:

addSubview(rankingLabel)
addConstraints(cellConstraints)

我通过将它们添加到单元格中contentView来解决了这个问题:

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

1
始终将子视图添加到contentView,而不是UITableViewCell直接添加。
dinesharjani

3

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

在此处输入图片说明


真正的问题是某个地方缺少约束。您可能正在垂直输入内容,而不是设置顶部/底部约束
TruMan1

1

转向Xcode 6 GM时,我也遇到了此警告。将设备旋转回原始位置时,才收到警告。

我正在使用自定义UITableViewCells。情节提要表视图设置为我的自定义大小(本例中为100.0)。尽管表格单元格可以像以前的版本一样正确呈现,但我不喜欢警告消息。

除了上述想法,我还添加了这个

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

屏幕渲染...响应旋转,没有更多警告消息。


因此,我尝试使用您给我的那一行使用您的方法,但是我仍然遇到相同的错误。我也没有在应用程序中使用旋转。
David E

1

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

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

1

如果您为tableView创建了一个custom tableViewCell,请确保已为您的单元格设置了底部和顶部约束,那么如果您的自定义单元格内的子视图在中心Y对齐,您也可能会收到此消息,这不会弹出任何错误消息,但会造成混乱依次确定表格视图的行高,就像我所附的图像一样,这里我们同时具有顶部和底部约束

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

但是,如果这不起作用,您可以尝试设置单元格的行高,而不是像这张图片那样自动设置行高

但是请确保,如果您关闭了自动打钩功能,则必须以编程方式调整行大小以适应可能自动完成的更改


0

在故事板设置的cell Row height字段具有相同的值作为Row heighttableView(都与我工作过的相同的值)。

如果heightForRowAtIndexPath在代码中添加函数,则可能会导致性能问题,因为将为每个单元调用该函数,因此请小心。


0

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


0

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


0

我收到了相同的错误消息,请确保您所有的出口都有效,例如表格视图和表格视图约束


0

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

  • 您应该根据顶部和底部等约束条件将所有元素相互链接。
  • 您绝对应该有一个底部约束,该约束链接到单元格底部的元素

0

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


0

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

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

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

0

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

tableView.rowHeight = 200;

将这行代码添加到

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

最终的代码看起来像

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

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


-1

我有相同的错误,由于此行显示此错误。

self.layer.backgroundColor = UIColor(white:1,alpha:0.2)as!CG色彩

我只是按照以下方式更改行以修复错误

self.layer.backgroundColor = UIColor(白色:1,alpha:0.2).cgColor

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.