ChatGPT解决这个技术问题 Extra ChatGPT

iOS8 - 约束含糊地暗示高度为零

有没有人知道如何调试这个?

仅警告一次:检测到约束模糊地建议 tableview 单元格的内容视图高度为零的情况。我们正在考虑意外折叠并使用标准高度。

行具有固定的高度,由

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

所有的constraints似乎都很开心...


A
Alex Cio

在我的情况下,强制返回高度和估计高度会使警告消失。

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

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

不需要这两个覆盖的另一种解决方案是在您的 loadView 或 init 方法中简单地使用 self.tableView.rowHeight = 44;


我在部分中有多个类型行,其中只有一个具有动态高度。然后它不工作
如果我们在 xib/storyboard 中设置默认高度,我们就不必实现这些方法。
M
MonsieurDart

还可以从内容视图的顶部和底部添加垂直约束。这将使自动布局高兴(因为他现在知道如何自己计算单元格的高度)。


这对我有用。我检查了所有容器单元格,并确保至少一个子视图同时具有“容器顶部空间”和“容器底部空间”约束。
这是 iOS 8 使用自调整表格视图单元格时的正确答案。
您的意思是从内容视图内部的元素到内容视图的顶部和底部的约束吗?
我试过这个,但我不断收到冲突的约束警告。
确保将顶部和底部约束添加到单元格的内容视图,而不是单元格本身。如果向单元格添加约束,代码仍然可以工作,但会尝试使用高度 0。
u
user2898617

如果您正在使用 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;
}

非常感谢。这对我帮助很大。起初我以为,这个问题出在另一个表格视图单元格上。调试后发现,这个问题出在另一个问题上。
我想这样做,但 long、section 和 row 是未知的。你能澄清一下这些在 Swift 中应该是什么吗?
l
ltm

如果使用自动布局并且您没有为每个表格视图单元格指定行高值,而是保留“默认”值,则 XCode 6.1 中似乎存在一个会导致此问题的错误。只需为每个单元格选中行高旁边的“自定义”复选框,警告就会消失。


如果您使用的是自动调整大小的单元格,则需要将行高设置为“默认”。
这解决了警告。但我相信它只在 TableView 中使用静态单元格时出现
@phatmann 此问题仅出现在静态单元格中,因此单元格不应自行调整大小。
@ltm 如果用户可能放大了文本,那么在静态单元格中,自动调整大小的单元格可能没有用? (你知道,在 iPhone 设置中的辅助功能下)
我认为这不是一个错误,它可能是垂直约束的问题,它们必须完全描述单元格的高度,至少对于具有自动尺寸的表格视图。
J
Juraj Antas

是的,即使您对表格视图单元格中的项目只有水平约束,您也会“满意”所有约束。我有同样的问题。您还需要添加垂直约束。这样做,该警告将消失。


C
Community

约束可以满足布局的目的,但不能满足自动行高的目的。一个愉快的布局意味着内容可以毫无歧义地布局。这将满足 Interface Builder 中的检查。

自动行高的快乐布局意味着,除了上述之外,您还包括对单元格底部的约束。

更多信息:Detected a case where constraints ambiguously suggest a height of zero


t
teho

我在表格视图大小检查器中使用了行高 43(或 <> 44),错误消失了。使用 44 我得到错误。 Xcode 版本 6.0.1。

-- 这个答案被版主删除了,请不要,它解决了问题。这为我解决了问题,也可能为其他人解决问题。所以你能不能不要再删除它了。


a
amir

我无法删除警告,但为了使约束起作用,我将 ,new to iOS8 ,tableview 属性 estimatedRowHeight 设置为固定高度,并删除了 heightForRowAtIndexPath 实现。


如果它没有删除警告而不是系统弥补缺失的约束并将行高 == 设置为 cell.rowHeight 属性。警告是关于自动修复属性的,如果它自动修复意味着问题不存在?
w
wrightak

如果您收到该警告,很可能是因为您正在使用自动布局,并且您的单元格内部没有任何约束。

您应该停止使用自动布局或实施明确定义单元格高度的约束。

您可以通过取消选中右侧文件检查器中的“使用自动布局”选项来关闭界面构建器中的自动布局。

如果您选择使用自动布局并且单元格的高度是固定的,那么实现适当的约束应该很容易。只需为单元格内容视图的子视图添加高度约束,并在子视图之间以及子视图和内容视图之间实现垂直空间约束。例如,如果您的单元格中有一个标签,这将起作用:

垂直约束

内容视图顶部和标签顶部之间的垂直空间约束标签的固定高度约束标签底部和内容视图底部之间的垂直空间约束

水平约束

内容视图的前缘和标签的前缘之间的水平空间约束 标签的固定宽度约束 标签的后缘和内容视图的后缘之间的水平空间约束


正如问题中提到的,我正在使用约束,他们似乎都很高兴。
这些限制是否适用于单元格内容视图的子视图?他们看起来怎么样?你有可能有一些不同的细胞吗?如果您使用 Frederic Bonner 的解决方案将单元格定义为具有固定高度,则约束将被覆盖。
r
ricardopereira

您可以使用 AutoLayout 为您计算正确的高度。这是一篇关于 iOS 8 上的动态单元格高度的好文章:http://natashatherobot.com/ios-8-self-sizing-table-view-cells-with-dynamic-type/


我希望它是这么简单。不幸的是,添加这两行并没有解决我的自动调整大小问题
K
King-Wizard

在 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)
    }
}

l
latenitecoder

对于沼泽标准修复,没有约束、没有估计高度或过度设计问题。我创建了一个默认项目,连接了 tableview,但忘记将高度委托放在视图控制器中。为了让这个警告消失,你需要这个。

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

在您的表的视图控制器中。


A
Alvin George

我在 uitableviewcell 中使用了 mapView。我将地图视图的高度更改为设备屏幕尺寸的 1/3。我得到了同样的错误。我通过向 uitableviewcell 的内容视图添加缺少的约束来修复错误。

1) 清除 contentView 约束。

2) 将重置为建议常量设置为 contentView。

https://i.stack.imgur.com/PEidJ.png

3)添加缺少的约束 - 如果有的话

https://i.stack.imgur.com/ZiXht.png


o
onmyway133

就我而言,这是因为我正在使用 xib 设计单元格,而我忘记将该 xib 文件添加到目标中。

在我将该xib文件添加到目标后,问题就消失了


Z
Zack Morris

虽然此页面上讨论添加高度约束或在 heightForRowAtIndexPath 中手动返回 44 之类的 rowHeights 的答案会导致警告消失,但它们是多余的,因为这是至少在版本 6.3.2 (6D2105) 中可见的 Xcode 中的错误。

如果在 viewDidLoad 中设置断点,即使在情节提要中指定行高为 44,也会看到 self.tableView.rowHeight = -1 (UITableViewAutomaticDimension)。这是因为如果您将行高保留为 44,Apple 会错误地假定您需要动态行高,因为它们没有为您提供指定偏好的标志。

以下是一些可能的解决方案及其结果:

在情节提要(作品)中将行高设置为 43 或 45。

在 heightForRowAtIndexPath 中手动返回 44 的高度(有效)。

在 UITableViewCell 的元素和它的 contentView 之间添加高度约束(有效)。

不幸的是,这些解决方案要么要求您更改设计,添加不必要的约束,要么添加不必要的代码来解决错误。我尝试了(我认为是)最简单的解决方案:

在情节提要中将每个 UITableViewCell 的高度设置为 44(自定义)(失败)。

我真的想要一个纯粹的故事板解决方案,所以最后我尝试了:

将用户定义的运行时属性添加到情节提要中的 UITableView,并命名 UITableView 并附上有关如何设置 rowHeight 的注释,以便未来的开发人员可以找到它:(有效):

https://i.stack.imgur.com/fRfSi.png

https://i.stack.imgur.com/QDQnm.png

这些错误在 iOS 开发中太常见了,迫使开发人员花费过多的时间来权衡他们的解决方案将如何影响长期可维护性的后果。

由于找到一个可维护且看起来不会混淆的概念上正确的解决方案是如此难以捉摸,并且假设 Apple 将修复该错误并且在可预见的将来 44 将成为默认行高,那么约束或用户定义运行时属性解决方案可能是最可维护的。


G
Greg

我认为这里发生了两件重要的事情。

1)如果您使用 ctrl+拖动,很容易使约束出错。因此,请仔细检查您是否正确完成了操作。最好使用屏幕左侧的托盘来绘制这些约束。

2) 不要在 ViewDidLoad 或其他地方指定estimatedRowHeight,而是使用委托方法

override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {}

这立即为我解决了问题。


你为什么要使用覆盖?
D
David Nix

我在使用通用故事板或 xib 时也看到了这个错误。如果您忽略为 Any x Any size 类指定适当的约束,我会看到出现此错误。

苹果似乎已经为 iOS9 解决了这个问题。对我来说,这个错误只发生在 8.4 上。


D
DrWhat

在这个错误和另一个与我想要的约束相冲突的约束被创建(不知道在哪里)的错误之间,我辗转反侧了好几天。我什至让它在每个可见属性都与另一个相同的情况下工作。我发现的唯一解决方案是原子化——用 xib 创建一个全新的文件,然后重新开始重新连接插座,复制粘贴旧代码。这可能不是最好的解决方案,但有时,如果问题不可见,就没有什么可做的了。至少,原子化是回顾正在发生的事情的好方法。


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅