强制 UILabel 占用 3 行

Posted

技术标签:

【中文标题】强制 UILabel 占用 3 行【英文标题】:Force UILabel to take up 3 lines 【发布时间】:2017-01-29 20:53:22 【问题描述】:

我正在开发音乐播放器,并为歌曲、专辑和艺术家设置了标签。现在,只是为了 UI,我希望歌曲标签始终使用 3 行空间,即使文本是 1 行。我在属性检查器中将行数设置为 3,但如果歌曲标题实际上那么长,它只会显示 3 行!

我的第一个解决方法是将标签的高度锁定为文本大小的 3 倍(然后一些用于间距)。有没有更好的解决方案?或者我可以使用其他对象?

【问题讨论】:

我建议添加屏幕截图,它们将非常有助于描述您想要实现的目标。 我需要一个标签来始终显示 3 行...真的需要截图吗? 你知道你想在哪里分割行吗?您可以将字符串拆分为子字符串,因为您可以通过在引号之间说出\r 来强制换行(这是一个反斜杠)。 另外,请注意,如果您确实强制将高度设置为3 x whatever_pointsize,您的文本(即使它小于 3 行)将始终垂直居中。如果您对此感到满意,我可以提供一个可能的解决方案,但它需要对UILabel 进行子类化。话虽如此,如果您的整体布局相对简单,那么最好的解决方案可能是标签中的几个约束。 嗯,字符串来自系统音乐播放器。所以它是从我手机上关于那首歌的信息中获取的。为了显示我使用的歌曲的文本:songLabel.text = nowPlayingItem.title(这是一个字符串)我锁定了高度,它确实垂直居中。关于如何在标签顶部而不是垂直居中开始文本的任何想法? 【参考方案1】:

要强制 UILabel 像在音乐播放器中一样占用三行,您只需使用 \n 在适当的位置添加换行符并将标签的行数设置为 3。

添加换行符:

var title = "Title"
var album = "Album"
var artist = "Artist"

label.text = "\(title)\n" +
      "\(album)\n" +
      "\(artist)\n"

将标签设置为 3 行:

label.numberOfLines = 3 // or set this to 4 or higher if the title of the song might exceed one line

【讨论】:

这实际上是很棒的信息!不过,这并不是我想要的。每个歌曲标题、专辑和艺术家都有单独的标签。我希望歌曲标题标签始终是 3 行文本的高度,并且专辑/艺术家锁定在 1 行。我一直在使用的解决方法是将高度锁定为文本高度的 3 倍多一点(对于 24 pt 字体,它达到 86 pts)。【参考方案2】:

我需要完成类似的事情 - 我需要 UILabel 始终保持两行高,无论文本如何。

经过一些实验,我发现在文本末尾天真地添加新行只会在文本只有一行高的情况下提供所需的行为。如果文本由于其内容而已经是两行高,那么它会在第二行的末尾产生省略号。

我使用另一个问题的代码来确定我的文本实际呈现了多少行,如果它少于预期,我在字符串末尾附加一个换行符\n。 How to find actual number of lines of UILabel?

只需在末尾添加与 UILabel 一样多的换行符,即可达到所需的行数。 (请注意,我在上述问题中使用的代码将返回比文本实际跨度多 1 行,所以我的逻辑类似于 if desiredLines >= myLabel.numberOfVisibleLines /*Appened \n to string*/

【讨论】:

【参考方案3】:

你可以试试这个方法:

    取一个 UILabel 并将其放入 UIStackView。

    设置 UILabel.amountOfLines = 3

    在标签下方的 UIStackView 中添加另一个 UIView。

    配置自动布局以使 UILabel 内在内容的优先级高于 UIView。

    将 UIStackView 高度设置为 3 行高度。

结果应该是无论文本有多少行,堆栈视图都将处于预期的高度。但是本质上,只要它有文本来填充它所拥有的 3 行,文本就会推动标签。

与接受的答案相反,您不需要关心文本是什么,因此这更有可能帮助其他需要此类内容的读者。

【讨论】:

但是你不会通过将 UILabel 的高度设置为 3 行高度来实现同样的效果吗?这种方法的问题是 3 行的高度是多少?用户可能具有动态字体大小,因此高度会有所不同。

以上是关于强制 UILabel 占用 3 行的主要内容,如果未能解决你的问题,请参考以下文章

单行文本在 UILabel 中占用两行

强制文本在 UILabel 中垂直居中

无法让 UILabel 显示超过 3 行

当 UITableViewCell 中的行数固定时,UILabel 占用空间?

文本更改后 UILabel 未正确换行

iOS——是不是可以强制 UILabel 子类对象成为第一响应者?