如何计算标签的最后一行宽度?

时间:2019-07-16 07:08:43

标签: ios swift

private func getLasLineWidth() -> CGFloat {

    let message = NSAttributedString(string: self.text!,
                                     attributes: [.font: self.font!])

    let labelWidth = self.bounds.width
    // Create instances of NSLayoutManager, NSTextContainer and NSTextStorage
    let labelSize = CGSize(width: labelWidth, height: .infinity)
    let layoutManager = NSLayoutManager()
    let textContainer = NSTextContainer(size: labelSize)
    let textStorage = NSTextStorage(attributedString: message)

    // Configure layoutManager and textStorage
     layoutManager.addTextContainer(textContainer)
    textStorage.addLayoutManager(layoutManager)

    // Configure textContainer
    textContainer.lineFragmentPadding = 0.0
    textContainer.lineBreakMode = .byWordWrapping
    textContainer.maximumNumberOfLines = 0

    let lastGlyphIndex = layoutManager.glyphIndexForCharacter(at: message.length - 1)
    let lastLineFragmentRect = layoutManager.lineFragmentUsedRect(forGlyphAt: lastGlyphIndex,
                                                                  effectiveRange: nil)

    return lastLineFragmentRect.maxX
}

我已经尝试了这行代码,但不适用于定向环境。我该如何解决这个问题?有人遇到这个问题吗?

1 个答案:

答案 0 :(得分:0)

问题似乎是由于您的getLasLineWidth()函数没有考虑您设置的段落样式引起的。

可以通过更改以下内容来解决该问题:

func getLasLineWidth() -> CGFloat {

    let message = NSAttributedString(string: self.text!,
                                     attributes: [.font: self.font!])

对此:

func getLasLineWidth() -> CGFloat {

    guard let message = self.attributedText else { return CGFloat.zero }

我只做了一些快速测试,但是看起来应该这样做。