如何防止`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`的文本顶部根据行数或截断而改变?的主要内容,如果未能解决你的问题,请参考以下文章