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
}
我试过这行代码,但它不适用于方向景观。我该如何解决这个问题?有人遇到过这个问题吗?
最佳答案
问题似乎是因为您的 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 }
我只做了一些快速测试,但看起来应该可以。
关于ios - 如何计算标签的最后一行宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57051804/