gpt4 book ai didi

swift - NSAttributedString boundingRect 返回错误的高度

转载 作者:行者123 更新时间:2023-11-28 07:31:39 25 4
gpt4 key购买 nike

我像这样计算 NSAttributedString 的高度。

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

我尝试了 SO 中提到的每一个“hack”,但是宽度越小,字符串高度就越不准确(计算出的高度大于实际高度)。

根据其他帖子,以下情况会导致尺寸计算出现问题:

  • 空格
  • 没有前景色
  • 无背景色
  • 宽度低于 300 不起作用 (?)

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

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

和一个大小为 11 的 userFixedPitchFont

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

PS:我想这与 lineBreak 有关,因为如果换行的行越多,错误就会越大。

最佳答案

我发现这个解决方案有效。请注意,如果您未将 lineFragmentPadding 设置为 0,它会产生与 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
}
}

关于swift - NSAttributedString boundingRect 返回错误的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54497598/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com