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

Posted

技术标签:

【中文标题】如何防止`UILabel`的文本顶部根据行数或截断而改变?【英文标题】:How prevent `UILabel`'s text top to change depending on number of lines or truncation? 【发布时间】:2018-02-24 15:40:15 【问题描述】:

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

正如您在图片中看到的那样,标签的顶部(谁是背景,我用灰色表示正在发生的事情)与图片顶部保持固定距离。这是根据我添加的约束。

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

我没有使用自定义字体。

以下是限制条件:

【问题讨论】:

将内容拥抱优先级垂直设置为 1000 @Sh_Khan 之前试过,现在又试了。不修复/更改此问题。 这可能与字体和行/某种其他类型的字体间距有关。如果你换成等宽字体会发生什么,我怀疑它们都将是相同的像素)?不过我认为,你不能让字体默认点击左上角的像素 @solenoid 与 Courier New 没有区别。您建议哪些垂直字体间距参数会导致这种情况? 我认为这与内在大小有关,导致不同字符框大小的高度略有不同,并且 UILabel 始终垂直居中。看看这个解决方案:***.com/a/19801698/4543629 【参考方案1】:

更大的问题是约束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 个像素的差异......?

【讨论】:

天哪,就是这样。你甚至准确地猜到了38 的正确高度;我为两个标签都填写了,瞧。谢谢! 看来我们有相似的背景。享受 ios,这是一个很棒的环境(除了有时像这样令人讨厌的事情)。 似乎如此。堆栈溢出时达到 +10k 的好工作!这是我目前的目标。 :D【参考方案2】:

label.sizeToFit 根据尺寸适合标签。移除约束height<=41

【讨论】:

我试过:1 和 2 行标签之间没有区别。我需要限制高度,所以<=41不能删除。

以上是关于如何防止`UILabel`的文本顶部根据行数或截断而改变?的主要内容,如果未能解决你的问题,请参考以下文章

UiLabel 文本从顶部被截断

swift iOS Swift:如何检查UILabel是否被截断?计算UILabel的行数

UILabel - 缩小文本而不是截断尾部

如何检查 UILabel 是不是被截断?

如何找出截断的 UILabel 文本的宽度

根据包含的文本设置 UILabel 的行数 - Objective C 和/或 Swift