提问者:小点点

UITextView:计算多行NSAttributedString高度


我有一个UITextView包含一个NSATTributedString。我想调整文本视图的大小,以便在给定固定宽度的情况下,显示整个字符串而不滚动。

nsattributedString有一个方法,允许为给定大小计算其边框

let computedSize = attributedString.boundingRect(with: CGSize(width: 200, height: CGFloat.greatestFiniteMagnitude),
                                                   options: .usesLineFragmentOrigin,
                                                   context: nil)

但不幸的是,它似乎不起作用,因为它总是返回单行的高度。


共1个答案

匿名用户

经过几次尝试,我发现我正在设置的NSatTributedStringByTruncatingTail作为NSPragraphStyleLineBreakMode 值(这是我们在应用程序中使用的默认值)。

为了实现所需的行为,我必须将其更改为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时不会发生这种情况。