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

its*_*its 7 uikit nsattributedstring uilabel kerning ios

UILabel如果我使用NSAttributedString自定义kern和我,我的错误高度lineSpacing.

这是我如何设置自定义kern和行间距:

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
}
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

结果

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

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

Tam*_*gel 2

这是一个错误NSAttributedStringKey.kern作为解决方法,您可以根据此答案中的UILabel建议计算行数。如果只有一行,则设置为 0。lineSpacing

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
}
Run Code Online (Sandbox Code Playgroud)