具有动态 UILabel 高度的 UITableViewCell 缩进



我正在加载一个表格视图,其中每个表格单元格都有一些左缩进(想想消息线程/回复),并且还包含一个动态高度的标签(回复的内容)。我正在使用自动布局,因此UILabel会自行调整大小。为了实现每个UITableViewCell的缩进,我遵循了SO上人们的建议,为我的UITableViewCell覆盖了layoutSubviews,因此它看起来像这样:

- (void)layoutSubviews
{
    [super layoutSubviews];
    float indentPoints = self.indentationLevel * self.indentationWidth;
    self.contentView.frame = CGRectMake(indentPoints,
        self.contentView.frame.origin.y,
        self.contentView.frame.size.width - indentPoints,
        self.contentView.frame.size.height);
}

现在发生的事情是,有时UILabel文本会在底部被截断。在我看来,UILabel 在计算适当的高度并绘制自己(因为它是动态的)时正在处理旧的框架大小,而不是具有缩进的新框架大小 - 使用缩进,可用于相同文本的宽度较小,因此它应该知道它需要更高。

如果我删除此缩进并注释掉对layoutSubviews的覆盖,或者如果我将调用[super layoutSubviews]放在末尾而不是开头,则文本不再被截断,但我失去了缩进。

我想要的是我的UITableViewCell适当地缩进,并且我的动态 UILabel 能够识别新的帧大小并在没有任何中断的情况下进行绘制。我曾尝试为我的UILabel在不同的地方拨打layoutIfNeeded电话,但没有成功。

您需要使用以下方法预先计算 UILabel 的大小:

CGSize size = [str sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];

使用它来调整单元格的大小。 最好在表视图数据源高度中执行此操作 RowAtIndexPath

事实证明,

此问题与以下堆栈溢出帖子具有相同的根本原因: UILabel 有时无法正确换行文本(自动布局)

使用此问题的公认解决方案(在布局子视图中设置首选最大布局宽度)为我解决了这个问题。

最新更新