包含多行UILabel的iOS8 Self-Sizing UITableViewCells的高度错误

时间:2015-05-28 14:47:43

标签: ios objective-c uitableview ios8 uitableviewautomaticdimension

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

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

我在UITableView中使用这些单元格,其中包含以下参数:

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

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

因为这对新创建的单元格不起作用,我强制UITableViewviewDidAppear中执行更新:

- (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之后)始终以正确的高度显示?

2 个答案:

答案 0 :(得分:0)

  

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

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

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

答案 1 :(得分:0)

我刚刚发现自定义UITableViewCell的布局存在问题,这也是由设置为0行的多行标签引起的。我通过将行数设置为2来解决我的需要,从而解决了该问题。

感谢您强调这一点,我们一直在试图解决它太久了。