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

当我运行包含 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 单元格中的图片不存在。

最佳答案

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

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

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

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

要使用动态单元格高度,连同其他海报已经提到的技术,也将消除此消息,您需要确保您的单元格具有足够的约束来将 UI 项绑定(bind)到单元格的顶部和底部。如果您之前使用过 Auto Layout,您可能习惯于设置 Top + Leading 约束,但动态行高也需要底部约束。

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

  • 计算具有固有大小的内容的维度。这包括 UILabels 和 UIImageViews,它们的尺寸分别基于它们包含的文本或 UIImages。这两个 View 都会认为它们的宽度是已知的(因为您已经为后缘/前缘设置了约束,或者您设置了明确的宽度,或者您使用了最终显示从一侧到另一侧的宽度的水平约束)。假设一个标签有一段文本(“行数”设置为 0,所以它会自动换行),它只能是 310 磅,所以在当前字体大小下它被确定为 120pt 高。
  • UI 根据您的定位约束进行布局。标签底部有一个约束连接到单元格的底部边缘。由于标签已经增长到 120 点高,并且由于它被约束绑定(bind)到单元格的底部,它必须将单元格“向下”推(增加单元格的高度)以满足“底部标签始终是距单元格底部的标准距离。

  • 如果缺少该底部约束,则会出现您报告的错误消息,在这种情况下,没有任何东西可以将单元格的底部“推”离单元格的顶部,这是报告的歧义:没有什么可以插入底部的顶部,细胞塌陷。但自动布局也检测到这一点,并回退到使用标准行高。

    对于它的值(value),并且主要是为了得到一个完整的答案,如果你确实实现了 iOS 8 的基于自动布局的动态行高,你应该实现 tableView:estimatedHeightForRowAtIndexPath: .该估计方法可以为您的单元格使用粗略的值,并且会在最初加载表格 View 时调用。它帮助 UIKit 绘制滚动条之类的东西,除非 tableview 知道它可以滚动多少内容,否则无法绘制滚动条,但不需要完全准确的尺寸,因为它只是一个滚动条。这使得实际行高的计算被推迟到需要单元格的那一刻,这减少了计算密集度,并且让您的 UITableView 呈现得更快。

    https://stackoverflow.com/questions/25902288/

    相关文章:

    iphone - 代码设计错误 : Certificate identity appearing t

    iphone - ${EXECUTABLE_NAME} 和 ${PRODUCT_NAME} 在哪里定

    ios - 如何在 UITextView 中禁用复制、剪切、选择、全选

    ios - Swift - 使用哪些类型? NSString 或字符串

    ios - 如何以编程方式检查 iOS 应用程序中是否存在键盘?

    ios - 添加一个简单的 UIAlertView

    ios - 获取 UITableView 的 Selected 索引

    ios - UILabel minimumScaleFactor 是如何工作的?

    ios - 带有两种不同颜色文本的 UILabel

    ios - 如何在 xcode 中以编程方式向按钮添加操作