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

时间:2014-09-18 00:13:12

标签: ios objective-c swift xcode uitableview

当我运行包含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时,我会遇到一些错误,但是自从我升级后它们已经消失了。我现在没有其他错误或警告。我已经尝试调整所有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单元格中的图片不存在。

22 个答案:

答案 0 :(得分:191)

你在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点高,并且由于它通过约束被绑定到单元格的底部,因此必须将单元“向下”(增加单元的高度)以满足“底部”的约束。标签总是距离单元格底部的标准距离。

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

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

答案 1 :(得分:105)

到目前为止,有三件事已经成功地压制了这个警告。你可以找到最方便的。没什么好看的。

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

    self.tableView.rowHeight = 44;
    
  • 转到故事板并将桌面视图中的行高更改为不同于44的内容。

  • 实现tableview的委托方法heightForRowAtIndexPath

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

怪异。

答案 2 :(得分:9)

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

enter image description here

答案 3 :(得分:9)

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

答案 4 :(得分:4)

我今天收到了这个警告。这就是让它消失的原因(在界面构建器中)

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

以外的值

我没有在代码中进行任何更改

答案 5 :(得分:3)

这是一个自动布局问题。确保您的子视图具有所有约束。对我来说,单元格中的标题标签缺少底部约束。当我补充说,警告消失了,一切都完美地出现了。

答案 6 :(得分:2)

如果您正在使用静态单元格或动态单元格,只需在检查器表格中向表格视图添加一些行高度,并取消选中自动到行高的右侧,即表示您将停止收到此警告。{ {3}}

答案 7 :(得分:1)

转到Xcode 6 GM时,我也经历过这个警告。当我将设备旋转回原位时,我才收到警告。

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

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

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

屏幕渲染...响应旋转而不再发出警告信息。

答案 8 :(得分:1)

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

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

答案 9 :(得分:1)

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

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

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

答案 10 :(得分:1)

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

我正在像这样在<!DOCTYPE html> <html lang="en" dir="ltr"> <head> <meta charset="utf-8"> <title></title> <link href="cover4.css" rel="stylesheet"> <!-- Font Awesome --> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous"> </head> <body> <header class="pagenav"> <input class="nav-right-btn" type="checkbox" id="nav-right-btn" /> <label class="nav-right-icon" for="nav-right-btn"><span class="navicon"></span></label> <ul class="nav-right"> <li><a href="#reel">Link1</a></li> <li><a href="#bio">Link2</a></li> <li><a href="#contact">Link3</a></li> </ul> </header> </body> </html> 的{​​{1}}方法中添加子视图和约束:

UITableViewCell

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

addSubview(rankingLabel)
addConstraints(cellConstraints)

答案 11 :(得分:1)

如果您已为tableView创建了一个自定义tableViewCell,请确保已为您的单元格设置了底部和顶部约束, 如果自定义单元格中的子视图在 Y中心居中,那么您也可能会收到此消息,这不会弹出任何错误消息,但会反过来为表视图标识行高like in Image I have attached , here we have both top and bottom constraints

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

但是,如果这不起作用,您可以尝试设置单元格的行高,而不是自动like in this image

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

答案 12 :(得分:0)

如果您使用UITableView扩展ViewController类,并且还使用导航控制器显示屏幕,那么您不需要执行带有标识符的segue,这可能会导致标识符ViewController错误,则可以使用pushViewController方法来显示聊天屏幕。为了摆脱这个错误,所以这里的代码只是将其粘贴到您的UItableView委托中

让chatBox = ChatBoxViewController() navigationController?.pushViewController(chatBox,animation:true)

只需输入要显示的ViewController的名称,然后完成。

答案 13 :(得分: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

答案 14 :(得分:0)

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

答案 15 :(得分:0)

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

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

答案 16 :(得分:0)

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

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

我只是按照以下步骤更改行以修复错误

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

答案 17 :(得分:0)

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

enter image description here

答案 18 :(得分:0)

我有相同的错误消息, 确保你的所有商店都有效,如表格视图和tableview约束

答案 19 :(得分:0)

I had this problem when my labels and views in the custom tableViewCell were constrained to the customCell, not its Content View. When I cleared the constraints and connected them to cells Content View the problem was solved.

答案 20 :(得分:0)

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

答案 21 :(得分:0)

在故事板中设置cell Row height字段与Row heighttableView的值相同(两者的价值相同)。

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