我有一个UITextView
包含一个NSATTributedString
。我想调整文本视图的大小,以便在给定固定宽度的情况下,显示整个字符串而不滚动。
nsattributedString
有一个方法,允许为给定大小计算其边框
let computedSize = attributedString.boundingRect(with: CGSize(width: 200, height: CGFloat.greatestFiniteMagnitude),
options: .usesLineFragmentOrigin,
context: nil)
但不幸的是,它似乎不起作用,因为它总是返回单行的高度。
经过几次尝试,我发现我正在设置的NSatTributedString
将ByTruncatingTail
作为NSPragraphStyle
的LineBreakMode
值(这是我们在应用程序中使用的默认值)。
为了实现所需的行为,我必须将其更改为bywordwrapping
或bycharwrapping
。
let paragraphStyle = NSMutableParagraphStyle()
// When setting "byTruncatingTail" it returns a single line height
// paragraphStyle.lineBreakMode = .byTruncatingTail
paragraphStyle.lineBreakMode = .byWordWrapping
let stringAttributes: [NSAttributedString.Key: Any] = [.font: UIFont(name: "Avenir-Book", size: 16.0)!,
.paragraphStyle: paragraphStyle]
let attributedString = NSAttributedString(string: string,
attributes: stringAttributes)
let computedSize = attributedString.boundingRect(with: CGSize(width: 200, height: CGFloat.greatestFiniteMagnitude),
options: .usesLineFragmentOrigin,
context: nil)
computedSize.height
请注意,在uilabel
上设置具有ByTruncatingTail
值的属性字符串(其中NumberofLines
值为0),该字符串的大小“自动”为多行,而在计算BoundingRect
时不会发生这种情况。