iOS8 - 约束模糊地表明高度为零

Chr*_*ris 100 objective-c uitableview heightforrowatindexpath ios8

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

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

行具有固定的高度,如下所示

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 34.0;
}
Run Code Online (Sandbox Code Playgroud)

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

小智 129

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

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

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 44;
}
Run Code Online (Sandbox Code Playgroud)

另一个不需要两个覆盖的解决方案就是self.tableView.rowHeight = 44;在你的loadView或init方法中使用.


Mon*_*art 77

还可以做的是从内容视图的顶部和底部添加垂直约束.这将使autolayout感到高兴(因为他现在知道如何计算自己的细胞高度).

  • 在使用自定义表格视图单元格时,这是iOS 8的正确答案. (7认同)
  • 这对我有用.我浏览了所有容器单元格并确保至少有一个子视图同时具有"容器顶部空间"和"容器底部空间"约束. (2认同)
  • 确保将顶部和底部约束添加到单元格的内容视图,而不是单元格本身.如果向单元格添加约束,代码仍然有效,但会尝试使用高度0. (2认同)

use*_*617 26

如果您正在使用autoLayout约束和UITableViewAutomaticDimension,则此错误不是通过覆盖代码中的高度而丢弃的一些错误问题.这意味着自动确定单元格高度不起作用,因为您没有所需的垂直约束.

如果您像我一样并且遇到此错误并需要帮助确定哪个单元格正在抛出错误,您可以在返回"heightforRowAtIndexPath"方法之前添加以下行.

NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
Run Code Online (Sandbox Code Playgroud)

这将打印出一长串的节和行列表,但错误将立即出现在导致错误的特定单元格之后,您可以快速识别导致问题的单元格并相应地修复约束.这对静态细胞特别有用.如果您没有使用autoLayout和自动单元格高度,则使用手动输入的数字覆盖高度将起作用,但实际上将禁用这些功能,如果您尝试使用这些功能,这将是一个非常糟糕的解决方案.

如果您以前没有使用'heightForRowAtIndexPath'方法但想要在不撤消UITableViewAutomaticDimension设置的情况下调试此错误,只需将其添加到您的代码中:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"Section %ld Row %ld", (long)[indexPath section], (long)[indexPath row]);
    return UITableViewAutomaticDimension;
}
Run Code Online (Sandbox Code Playgroud)


小智 9

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

  • 如果使用自调整单元格,则需要将行高设置为"默认". (2认同)