NSAttributedString boundingRect返回错误高度

问题描述 投票:1回答:1

我估计像这样的NSAttributedString的高度。

let maxSize = NSSize(width: w, height: CGFloat.greatestFiniteMagnitude)
let rect = boundingRect(with: maxSize, options: [.usesFontLeading, .usesLineFragmentOrigin])
let height = rect.integral.size.height

我想这是在提到SO大约每“黑客”,但该字符串的高度变得更不准确的宽度变小(计算高度比实际高度大)。

据其他职位以下的事情会导致大小计算的问题:

  • 空白
  • 没有前景色
  • 无背景颜色
  • 低于300的宽度不工作(?)

我发现,这些建议都做出任何区别。的归属串是线的串联,每一个都具有foregroundColorbackgroundColor。该字符串还具有以下段落样式。

 let pstyle = NSMutableParagraphStyle()
 pstyle.lineSpacing = 6
 pstyle.lineBreakMode = .byWordWrapping

和尺寸11的userFixedPitchFont

为什么高度误差变大的宽度越小?

PS:我想它有什么用lineBreak做到,因为如果有更多行是自动换误差变大。

swift macos cocoa nsattributedstring
1个回答
0
投票

我发现,这个解决方案工作。需要注意的是,如果你不设置lineFragmentPadding0,它产生相同的(错误的)结果boundingRect

extension NSAttributedString {

    func sizeFittingWidth(_ w: CGFloat) -> CGSize {
        let textStorage = NSTextStorage(attributedString: self)
        let size = CGSize(width: w, height: CGFloat.greatestFiniteMagnitude)
        let boundingRect = CGRect(origin: .zero, size: size)

        let textContainer = NSTextContainer(size: size)
        textContainer.lineFragmentPadding = 0

        let layoutManager = NSLayoutManager()
        layoutManager.addTextContainer(textContainer)

        textStorage.addLayoutManager(layoutManager)

        layoutManager.glyphRange(forBoundingRect: boundingRect, in: textContainer)

        let rect = layoutManager.usedRect(for: textContainer)

        return rect.integral.size
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.