使用动态高度时 UITableViewCell 的情节提要冲突约束

Posted

技术标签:

【中文标题】使用动态高度时 UITableViewCell 的情节提要冲突约束【英文标题】:Storyboard conflicting constraints for UITableViewCell while using dynamic height 【发布时间】:2015-01-24 13:48:32 【问题描述】:

我对故事板有一个奇怪的问题。我正在重构我的应用程序代码,以利用使用行高的自动尺寸而不是 UITableViewDelegate 方法。我的单元格非常简单——它只有一个子元素,即 UIView。我添加了约束:

我有约束冲突:

但在模拟器上一切正常,我在控制台中没有任何约束警告。

你能告诉我有什么问题吗?也许我不了解单元格动态大小,但在我看来,我应该设置约束来确定单元格高度而不会产生歧义(我的三个约束正在这样做)。

【问题讨论】:

如果 UITableViewCell 的高度不是 63,则三个约束是冲突的 :)。您提到了“单元格动态调整大小”,所以我猜子视图的高度应该是可变的。在这种情况下,您可以尝试移除高度 (50) 约束。 我不想明确设置 UITableViewCell 的高度。我想自动布局从 UITableViewCell 的子视图的高度确定这个值。 我明白了。故事板中显示的冲突可能来自“表格视图单元格”的设置 - 高度。如上所述,它必须是 63(如果“分隔符”设置为“无”),否则正确的值为 64。 【参考方案1】:

对于单元格中的视图,view.bottom 的最近邻居是 12,即 superview.Bottom.Margin(或单元格的内容视图)。您要求 view.bottom 的约束为 8。此外,为了满足这些约束,界面构建器需要更改视图的高度(示例中的蓝色)。这当然不能做到,因为有一个约束将视图的高度限制为 50。

为了解决这个问题,数字加起来将表格视图单元格的高度更改为 80 而不是默认的 84。但是如果您打算动态更改表格单元格的高度,您可能会遇到更多的约束问题。

或将约束“垂直空间-(8)-内容视图-视图”更改为常数 12。因此它将是“垂直空间-(12)-内容视图-视图”。同样,如果您动态更改表格单元格的高度,您将遇到问题。

您是否打算让视图在表格单元格中居中?如果是这种情况,则删除两个垂直约束并添加一个中心 y 对齐约束。然后,当您更改单元格的高度时,视图将通过计算顶部和底部约束应该是什么来垂直居中。

下面是我创建的示例项目:

#import "testLayoutControllerTableViewController.h"

@interface testLayoutControllerTableViewController ()
@property (weak, nonatomic) IBOutlet UITableView *thetable;
@end

@implementation testLayoutControllerTableViewController

- (void)viewDidLoad 
    [super viewDidLoad];


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
    return 1;


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    return 10;


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellid"];
    return cell;


@end

我会发布界面构建器设置的图像以及它在模拟器中的外观,但我没有足够的声誉。

【讨论】:

你从哪里得到值 12? 我已将 y 约束添加为 contentView 的垂直中心,但在这种情况下,当我在模拟器中运行它时,行的高度小于蓝色视图。 当您尝试向视图添加底部约束时。建议的值是最近邻的空间。对于底部的建议 12 垂直居中约束应添加到蓝色 UIView 而不是 Content View。如果您没有在代码中明确修改表格单元格的高度,并且 Interface builder 中的所有引用都已正确连接,它应该可以正常工作。 好的,我现在明白了。问题是故事板中单元格高度的结果。我认为故事板中设置的高度仅用于测试目的。我已将高度设置为 63 (50+5+8),一切正常,没有故事板警告。

以上是关于使用动态高度时 UITableViewCell 的情节提要冲突约束的主要内容,如果未能解决你的问题,请参考以下文章

如何在自动布局中使用 UITableViewCell 的动态高度并在底部视图隐藏时将其他视图向上移动?

滚动时 UITableViewCell 自动布局抖动的动态单元格高度问题

具有动态高度的 UITableViewCell 中的 UILabel

动态高度 UITableViewCell 闪烁

Autolayout - 当一个视图具有动态高度时,在 UITableViewCell 中垂直居中两个视图

动态 UITableViewCell 高度内的动态 UITextView?