UILabel的行间距,单行文本

时间:2015-08-29 22:05:40

标签: ios autolayout uilabel nsattributedstring

即使标签的文字适合一行,预计具有自定义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

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

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

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

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

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

答案 2 :(得分:2)

paragraphStyle.lineBreakMode = NSLineBreakByCharWrapping 
当文本是多行时,

可以避免此问题。

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

希望这对你有所帮助!

答案 3 :(得分:1)

这是定义。 UILabel的问题。它适用于自定义字体和系统字体。

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

答案 4 :(得分:-1)

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

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