【问题标题】:Wrong height for UILabel when using custom lineSpacing and kern使用自定义 lineSpacing 和 kern 时 UILabel 的高度错误
【发布时间】:2018-07-26 10:47:54
【问题描述】:

如果我使用具有自定义kernlineSpacingNSAttributedString,我的UILabel 高度错误。

这是我设置自定义字距和行距的方法:

override func viewDidLoad() {
    super.viewDidLoad()

    let shortText = "Single line"
    self.label.attributedText = self.getAttributedText(text: shortText, kern: 0.2, lineSpacing: 8)
    self.label2.attributedText = self.getAttributedText(text: shortText, kern: 0, lineSpacing: 8)
}

private func getAttributedText(text: String, kern: CGFloat, lineSpacing: CGFloat) -> NSAttributedString {
    let attributedString = NSMutableAttributedString(string: text)

    let style = NSMutableParagraphStyle()
    style.lineSpacing = lineSpacing

    let attributes: [NSAttributedStringKey : Any] =
        [.paragraphStyle : style,
         .kern: kern]

    attributedString.addAttributes(attributes,
                                   range: NSMakeRange(0, attributedString.length))

    return attributedString
}

这是我得到的:

第一个标签(具有自定义字距的标签)的高度错误。它比应有的高度正好高 8 点 - 这是我正在使用的自定义行高。

这只发生在单行标签上。如果我使用几行上的文本,它会按预期工作。

【问题讨论】:

标签: ios uikit uilabel nsattributedstring kerning


【解决方案1】:

这是NSAttributedStringKey.kern 的一个错误。作为一种解决方法,您可以使用建议in this answer 计算UILabel 的行数。如果只有一行,将lineSpacing设置为0。

private func getAttributedText(text: String, kern: CGFloat, lineSpacing: CGFloat) -> NSAttributedString {
    let attributedString = NSMutableAttributedString(string: text)

    let font = UIFont.systemFont(ofSize: 16)

    let attributes: [NSAttributedStringKey : Any] = [.kern: kern,
                                                     .font: font]

    attributedString.addAttributes(attributes, range: NSMakeRange(0, attributedString.length))

    let maxSize = CGSize(width: [custom width], height: CGFloat.greatestFiniteMagnitude)
    let sizeOfLabel = attributedString.boundingRect(with: maxSize, options: .usesLineFragmentOrigin, context: nil)

    if sizeOfLabel.height > font.lineHeight {
        let style = NSMutableParagraphStyle()
        style.lineSpacing = lineSpacing

        attributedString.addAttribute(.paragraphStyle, value: style, range: NSMakeRange(0, attributedString.length))
    }

    return attributedString
}

【讨论】:

  • 此解决方法可能在大多数情况下都有效。它有性能损失,因为您需要至少计算每个 UILabel 的高度两次。在我的情况下,该字符串的初始化发生在布局传递之前很久,这意味着我不能轻易传递该 UILabel 的宽度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2012-04-02
  • 1970-01-01
  • 2014-07-03
  • 2018-06-28
相关资源
最近更新 更多