有没有人知道如何调试这个?
仅警告一次:检测到约束模糊地建议 tableview 单元格的内容视图高度为零的情况。我们正在考虑意外折叠并使用标准高度。
行具有固定的高度,由
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 34.0;
}
所有人constraints
似乎都很高兴...
有没有人知道如何调试这个?
仅警告一次:检测到约束模糊地建议 tableview 单元格的内容视图高度为零的情况。我们正在考虑意外折叠并使用标准高度。
行具有固定的高度,由
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 34.0;
}
所有人constraints
似乎都很高兴...
在我的情况下,强制返回高度和估计高度会使警告消失。
- (CGFloat)tableView:(UITableView *)tableView
estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
- (CGFloat)tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 44;
}
不需要两个覆盖的另一种解决方案是简单地self.tableView.rowHeight = 44;
在您的loadView
或 init 方法中使用。
还可以从内容视图的顶部和底部添加垂直约束。这将使自动布局高兴(因为他现在知道如何自己计算单元格的高度)。
如果您正在使用 autoLayout 约束和 UITableViewAutomaticDimension,则此错误不是通过在代码中覆盖您的高度来丢弃的错误问题。这意味着自动确定单元格高度不起作用,因为您没有所需的适当垂直约束。
如果您像我一样遇到此错误并且需要帮助确定哪个单元格引发了错误,您可以在返回“heightforRowAtIndexPath”方法之前添加以下行。
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
这将打印出一长串部分和行的列表,但错误将立即出现在导致错误的特定单元格之后,您可以快速确定导致问题的单元格并相应地修复您的约束。这对静态单元格特别有用。如果您不使用 autoLayout 和自动单元格高度,则使用手动输入的数字覆盖高度将起作用,但实际上会禁用这些功能,如果您尝试使用这些功能,这是一个非常糟糕的解决方案。
如果您以前没有使用 'heightForRowAtIndexPath' 方法,但想在不撤消 UITableViewAutomaticDimension 设置的情况下调试此错误,只需将其添加到您的代码中:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
return UITableViewAutomaticDimension;
}
如果使用自动布局并且您没有为每个表格视图单元格指定行高值,而是保留“默认”值,则 XCode 6.1 中似乎有一个错误会导致此问题。只需为每个单元格选中行高旁边的“自定义”复选框,警告就会消失。
是的,即使在表格视图单元格中只有项目的水平约束的情况下,您也会“满意”所有约束。我有同样的问题。您还需要添加垂直约束。这样做,该警告将消失。
约束可以满足布局的目的,但不能满足自动行高的目的。一个愉快的布局意味着内容可以毫无歧义地布局。这将满足 Interface Builder 中的检查。
自动行高的快乐布局意味着,除了上述之外,您还包括对单元格底部的约束。
更多信息:检测到约束模糊地表明高度为零的情况
我在表格视图大小检查器中使用了行高 43(或 <> 44),错误消失了。使用 44 我得到错误。Xcode 版本 6.0.1。
-- 这个答案被版主删除了,请不要,它解决了问题。这为我解决了问题,也可能为其他人解决问题。所以你能不能不要再删除它了。
我无法删除警告,但为了使约束起作用,我将 ,new 设置为 iOS8 ,将 tableview 属性estimatedRowHeight
设置为固定高度,并删除了heightForRowAtIndexPath
实现。
如果您收到该警告,很可能是因为您正在使用自动布局,并且您的单元格内部没有任何约束。
您应该停止使用自动布局或实施明确定义单元格高度的约束。
您可以通过取消选中右侧文件检查器中的“使用自动布局”选项来关闭界面构建器中的自动布局。
如果您选择使用自动布局并且单元格的高度是固定的,那么实现适当的约束应该很容易。只需为单元格内容视图的子视图添加高度约束,并在子视图之间以及子视图和内容视图之间实现垂直空间约束。例如,如果您的单元格中有一个标签,这将起作用:
垂直约束
水平约束
您可以使用 AutoLayout 为您计算正确的高度。这是一篇关于 iOS 8 上动态单元格高度的好文章:http: //natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/
在Swift中强制返回高度解决了我的问题:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if(indexPath.row == 0){
return CGFloat(131.0)
}else if(indexPath.row == 8){
return CGFloat(97.0)
}else{
return CGFloat(44.0)
}
}
对于沼泽标准修复,没有约束、没有估计高度或过度设计问题。我创建了一个默认项目,连接了 tableview 但忘记将高度委托放在视图控制器中。为了让这个警告消失,你需要这个。
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 44;
}
在您的表的视图控制器中。
就我而言,这是因为我正在使用 xib 设计单元格,而我忘记将该 xib 文件添加到目标中。
在我将该xib文件添加到目标后,问题就消失了
虽然此页面上讨论添加高度约束或在 heightForRowAtIndexPath 中手动返回 44 之类的 rowHeights 的答案会导致警告消失,但它们是多余的,因为这是至少在版本 6.3.2 (6D2105) 中可见的Xcode 中的错误。
如果在 viewDidLoad 中设置断点,即使在情节提要中指定行高为 44,也会看到 self.tableView.rowHeight = -1 (UITableViewAutomaticDimension)。这是因为如果您将行高保留为 44,Apple 会错误地假定您需要动态行高,因为它们没有为您提供指定偏好的标志。
以下是一些可能的解决方案及其结果:
在情节提要(作品)中将行高设置为 43 或 45。
在 heightForRowAtIndexPath 中手动返回 44 的高度(有效)。
在 UITableViewCell 的元素和它的 contentView 之间添加高度约束(有效)。
不幸的是,这些解决方案要么要求您更改设计,添加不必要的约束,要么添加不必要的代码来解决错误。我尝试了(我认为是)最简单的解决方案:
我真的想要一个纯粹的故事板解决方案,所以最后我尝试了:
<img src="https://i.stack.imgur.com/QDQnm.png" alt="在此处输入图片描述">
这些错误在 iOS 开发中太常见了,迫使开发人员花费过多的时间来权衡他们的解决方案将如何影响长期可维护性的后果。
由于找到一个可维护且看起来不会混淆的概念上正确的解决方案是如此难以捉摸,并且假设 Apple 将修复该错误并且在可预见的将来 44 将成为默认行高,那么约束或用户定义运行时属性解决方案可能是最可维护的。
我认为这里发生了两件重要的事情。
1)如果您使用 ctrl+拖动,很容易使约束出错。因此,请仔细检查您是否正确完成了操作。最好使用屏幕左侧的托盘来绘制这些约束。
2) 不要在 ViewDidLoad 或其他地方指定estimatedRowHeight,而是使用委托方法
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}
这立即为我解决了问题。
我在使用通用故事板或 xib 时也看到了这个错误。如果您忽略为 Any x Any size 类指定适当的约束,我会看到出现此错误。
苹果似乎已经为 iOS9 解决了这个问题。对我来说,这个错误只发生在 8.4 上。
在这个错误和另一个与我想要的约束相冲突的约束被创建(不知道在哪里)的错误之间,我辗转反侧了好几天。我什至让它在每个可见属性都与另一个相同的情况下工作。我发现的唯一解决方案是原子化——用 xib 创建一个全新的文件,然后重新开始重新连接插座,复制粘贴旧代码。这可能不是最好的解决方案,但有时,如果问题不可见,就没有什么可做的了。至少,原子化是回顾正在发生的事情的好方法。