UILabel的行间距,单行文本

问题描述 投票:18回答:5

是否期望具有自定义lineSpacing属性的多行UILabel包括该行间距,即使标签的文本适合一行?

这是我的标签:

let label = UILabel()
label.numberOfLines = 4
var paragraph = NSMutableParagraphStyle()
paragraph.lineSpacing = 5
paragraph.lineBreakMode = .ByTruncatingTail
label.attributedText = NSAttributedString(string: "Some short text", attributes: [NSParagraphStyleAttributeName: paragraph])

这是如何布局的。请注意文本下方的额外间距。

enter image description here

为了比较:

enter image description here

奇怪的是缺乏一致性。当标签延伸到第二行时,底线不再包含此额外间距:

enter image description here

当有一行文本时,有没有办法删除这个行间距?或者其他一些方法来强制执行某些一致性,这样我至少可以解释它?

更新

基线计算似乎也被打破了。尝试将视图(此处为红色框)与标签的基线对齐时,会部分覆盖多行标签。

enter image description here enter image description here

ios autolayout uilabel nsattributedstring
5个回答
2
投票

既然你说你使用的是自定义字体,那么根据以前的经验我最好的猜测就是你看到的那个问题的根本原因在于自定义字体本身的某个部分。每当我被客户端给出自定义字体时,90%的时间,实际字体指标都是“错误的”(由Apple的内部字体渲染子系统解释,即使它可能在其他地方正确呈现)。

好消息是,这是可以修复的,但它需要使用新指标重建字体,这通常是一个试验/错误事件。您可能还需要检查您对该字体的许可是否允许这样的事情(如果它甚至重要)。

话虽这么说,每当我开始一个新项目时,这些都是我为这个确切场景保留的问题的一些资源:

这是一个类似的问题,假设这是一个自定义字体问题:“Custom UIFont baseline shifted”。这个问题在UIButton“UIButton custom font vertical alignment”中处理这个问题,但这两个问题最终都回答了这个问题“Custom installed font not displayed correctly in UILabel”。

我现在有一个自定义字体的个人测试平台应用程序,每当我第一次给自定义字体时,我都会使用它。这允许我为每次重建迭代单独测试字体,以确保它完美呈现。确保以各种字体大小甚至其他语言(是的,大量排列)测试您的更改。我在使用自定义字体时遇到了泰语和中文的问题,因为它们的上升程序非常靠近UILabel的边界框的边缘。我为自己创建的测试平台包括以各种尺寸和各种尺寸的各种语言呈现的基本UILabel中呈现的字体(因为就像我说的那样,我在过去使用某些语言的自定义字体表现不错用罗马字符)。

如果有人有更好的解决方案,我很乐意听到它,因为我几乎每次都遇到自定义字体这个问题。这是我在开始在布局期间补偿字体渲染问题或使用单个属性字符串调整之前将问题解决的问题。我不是字体专家,我只是喜欢使用内置字体渲染字体的人(特别是在使用自动布局时)。


2
投票

如果只有一行,您可以计算行数并将lineSpacing设置为0。

但可能有更好的解决方案。


2
投票
paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping 

文本是多行时可以避免此问题。

使用fontName [UIFont fontWithName:@"PingFangSC-Regular" size:14]显式设置字体,而不是使用[UIFont systemFontOfSize:14]可以避免文本是单行时的问题。

希望这对你有所帮助!


1
投票

这是def。 UILabel的一个问题。它适用于自定义以及系统字体。

如果你可以使用UITextView,那就去吧。 UITextView对单行或多行文本行间距没有问题,并且行为正确(单行=无行间距)。 这样您还可以避免创建自定义行计数func / ext。


-1
投票

是的,无论标签中有多少行,都会应用lineSpacing。如果您正在使用自动布局,则可以通过将标签的baseline约束到其父视图或同级视图(视情况而定)来解决此问题,而不是将标签的上边缘与父级或兄弟的顶部对齐。 (但是,假设您的标签的背景颜色与其父视图的颜色相同;否则,您将看到额外的行间距显示在背景颜色中。

你可以做的另一件事(这可能更好,现在我考虑一下)是设置paragraphSpacing0属性。这应该否定标签中最后一行的lineSpacing,无论你有多少行。

© www.soinside.com 2019 - 2024. All rights reserved.