使用自定义lineSpacing和kern时UILabel的高度错误

时间:2018-02-15 15:57:18

标签: ios uikit uilabel nsattributedstring kerning

如果我使用具有自定义UILabelNSAttributedString的{​​{1}},则kern的身高会出错。

以下是我设置自定义kern和行间距的方法:

lineSpacing

这就是我得到的:

Result

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

这仅适用于单行标签。如果我使用几行文本,它会按预期工作。

1 个答案:

答案 0 :(得分:2)

这是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
}