1

我以编程方式生成的自定义UITableViewCell包含几个UILabel可以包装文本的内容:

newLabel.numberOfLines = 0;
newLabel.lineBreakMode = NSLineBreakByWordWrapping;

我在 a 中使用这些单元格,并UITableView带有以下参数:

self.tableView.estimatedRowHeight = 120.0;
self.tableView.rowHeight = UITableViewAutomaticDimension;

因此,我希望单元格的高度会自动调整,并UILabel在需要时显示多行。

因为这对新创建的单元格不起作用,所以我强制UITableView执行更新viewDidAppear

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (self.appearsFirstTime) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView beginUpdates];
            [self.tableView endUpdates];
            self.appearsFirstTime = NO;
        });
    }
}

这适用于在第一次出现时生成的单元格,UITableView因此在更新时已经存在。但是,它不适用于稍后通过滚动生成的单元格。这些后来初始化的单元格没有机会从更新中受益,因此高度不正确。

我找到了一种不同的方法来解决这个问题:https ://stackoverflow.com/a/25967370/4943710 但是这种方法的缺点是布局过程可能需要多次通过。然后,该方法正在处理导致不正确高度的临时结果。结果又是缺少文本行。此外,似乎单元格在以后的更新中失去了适应能力(例如,当改变界面方向时)。

现在我的问题是: 如何确保稍后生成的单元格(更新后UITableView)始终以正确的高度显示?

4

2 回答 2

0

因此,我希望单元格的高度会自动调整,并且 UILabel 在需要时会显示多行。

您的“因此”有点为时过早。自动单元格高度还有另一个要求,您可能不满意:单元格的内容视图的高度必须由固定在内容视图及其子视图之间的约束内到外确定。

因此,您可能在单元格中有一个标签,但如果它的顶部和底部没有被约束固定到单元格内容视图的顶部和底部,则不会发生任何事情。而你,在你的问题中,并没有说他们是。

于 2015-05-28T15:06:21.347 回答
0

我刚刚发现我的自定义布局存在问题,UITableViewCell这也是由设置为 0 行的多行标签引起的。我通过将行数设置为 2 来修复它,足以满足我的需要,问题得到了解决。

感谢您强调这一点,我们已经尝试修复它太久了。

于 2020-07-01T09:22:35.320 回答