我估计像这样的NSAttributedString
的高度。
let maxSize = NSSize(width: w, height: CGFloat.greatestFiniteMagnitude)
let rect = boundingRect(with: maxSize, options: [.usesFontLeading, .usesLineFragmentOrigin])
let height = rect.integral.size.height
我想这是在提到SO大约每“黑客”,但该字符串的高度变得更不准确的宽度变小(计算高度比实际高度大)。
据其他职位以下的事情会导致大小计算的问题:
我发现,这些建议都做出任何区别。的归属串是线的串联,每一个都具有foregroundColor
和backgroundColor
。该字符串还具有以下段落样式。
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
}
}