自动布局不适用于可重用的表格视图单元格

Posted

技术标签:

【中文标题】自动布局不适用于可重用的表格视图单元格【英文标题】:Autolayout not working with reusable tableview cells 【发布时间】:2013-09-21 16:08:35 【问题描述】:

我正在尝试使用 Autolayout 和 Interface Builder 创建自定义 TableViewCell。我在 viewDidLoad 中设置了我的单元格,如下所示:

[tableView registerNib:[UINib nibWithNibName:@"BChatCell" bundle:Nil] forCellReuseIdentifier:@"ChatCell"];

然后我像这样使单元格出列:

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

当表格视图第一次加载时,它会正确加载:

但是,表格滚动后,自动布局中断:

以下是限制条件:

任何帮助将不胜感激。

【问题讨论】:

你需要显示更多的约束,也许检查你是否将 translateAutoResizeMaskToConstraints 设置为 NO。 我尝试关闭自动调整大小的蒙版,但它完全破坏了自动布局。 约束对我来说看起来不错,BChatCell 中的任何空间? 有人对此有所了解吗?我现在遇到了,找不到解决办法。 到目前为止我还没有找到解决方案。我只是用框架来布置我的单元格。 【参考方案1】:

我遇到了完全相同的问题。快把我逼疯了,因为在细胞被重复使用之前,一切看起来都很棒。

我发现正在调整大小的视图不是单元格本身(始终是屏幕宽度),而是我拥有的内部内容视图。您可以使用 NSLog(@"%@", [theView constraints]); 在任何视图上打印所有约束,这有助于调试

也试过无济于事:

将所有重要视图和子视图设置为translatesAutoresizingMaskIntoConstraints=NO

-(void)prepareForReuse内手动设置边界

致电setNeedsUpdateConstraints

问题是我已将我的内部卡片视图命名为 "contentView",它已经是 UITableViewCell 中的命名视图。更改它修复了调整大小的问题。

【讨论】:

【参考方案2】:

您的方法的问题是静态的前导和尾随。您的尾随常数是 200,当您旋转它时,您希望它变得超过 200(因为屏幕的宽度)。这打破了约束,可能在控制台中说你的约束有歧义,它会自动添加一个新的约束(这会导致奇怪的行为)。

所以我的建议是尝试使尾随约束大于或等于 200 并查看它是否有效。 另一种解决方案是为该蓝色视图添加宽度约束并删除尾随约束。

我希望这会有所帮助!

【讨论】:

旋转屏幕时这不是问题。滚动表格时会出现问题。此外,如果我确实旋转了屏幕,预期的行为将是蓝色方块扩大。我不知道它怎么能打破约束? 这真的很奇怪。旋转后是否有任何控制台错误?通常当出现问题时,它会抛出某种类型的异常并处理它(以一种糟糕的方式)。 嗨萨米,如果你仔细看看原来的问题,这不是屏幕旋转的问题。当细胞被重复使用时,它们会失去约束,这是一个问题。没有任何错误消息。 @BenSmiley 试试这个 [cell setNeedsLayout:YES];在你的 cellForRowAtIndexPath: 返回之前。

以上是关于自动布局不适用于可重用的表格视图单元格的主要内容,如果未能解决你的问题,请参考以下文章

自动布局单元格高度不适用于单个单元格

Tableview 单元格可重用性,切割标签文本

如何使用自动布局来调整表格视图单元格中的视图?

如何在自动布局中滑动表格视图单元格?

iOS 8 中的表格视图单元格自动布局

自动布局 - 在表格单元格中对齐视图