如何防止 `UILabel` 的文本顶部根据行数或截断而改变?

How prevent `UILabel`'s text top to change depending on number of lines or truncation?

UILabel(s) 中的文本顶部(在 table 视图单元格上)似乎取决于行数和截断。

正如您在图像中看到的那样,标签的顶部(我将其背景涂成灰色以指示发生了什么)与图像顶部保持固定距离。这是根据我添加的约束。

然而,在显示的三个 cases/cells 中,文本的顶部是 8、7 甚至 11 个像素。我怎样才能防止这种情况发生?

我没有使用自定义字体。

约束条件如下:

label.sizeToFit 根据大小适合标签。删除约束 height<=41

更大的问题是约束height <= 41。当标题不在两行之内时,titleLabel 将尝试增长超过两行的高度(我猜你的情况是 38 左右?)但随后停止在约束的 41.由于这略高于两条线的高度,因此当线在其框架内居中时,第一条线的顶部将变得低几个像素。这解释了您的第一个示例和第三个示例之间的区别。

一个可能的解决方案(尽管只有故事板会更好)是在分配标签时测量标签的高度,然后手动将高度约束更新为一行或两行高度。

cell.titleLabel.text = @"your title";
CGSize size = CGSizeMake(cell.titleLabel.bounds.size.width, 0);
size = [cell.titleLabel sizeThatFits:size];

if (size.height > lineHeight)
    cell.heightConstraint.constant = lineHeight * 2;
else
    cell.heightConstraint.constant = lineHeight;

heightConstraint 连接到您的高度限制,您需要将其更改为 = 类型。要计算 lineHeight 您可以(例如)在初始化时为标签分配一个短常量字符串,然后对其进行测量。

至于第一个例子和第二个例子的区别,我真的没有任何解决办法,除了在上面的else语句中添加一个常量。是的,它很丑,需要在不同的设备上进行测试,看看它是否有效。或者也许您可以忍受 1 个像素的差异...?