当前位置: 首页 > 知识库问答 >
问题:

UITextView:计算多行NSAttributedString高度

司寇烨伟
2023-03-14

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

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

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

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

共有1个答案

上官琦
2023-03-14

经过几次尝试,我发现我正在设置的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时不会发生这种情况。

 类似资料:
  • 我正在用Apache POI 3.13编写一个Excel(xls)表。我手动设置列宽。如果单元格的内容太长,我希望对其进行包装,并调整列高度。 如果我将单元格样式的wrapText属性设置为true,则文本不再“流出”单元格,但如何将行的高度设置为合适的值? 我见过的所有方法都计算字符串中的换行符。这对我不起作用,因为我的文本不包含手动换行符。

  • 如何在 iOS 7 中计算带有 UI 文本视图的 UI 表查看器的高度? 我找到了很多类似问题的答案,但是< code>sizeWithFont:参与了每一个解决方案,这个方法已经被否决了! 我知道我必须使用但是如何计算我的TextView显示整个文本所需的高度呢?

  • 读过我之前问题的人都知道我在理解和实现快速排序和快速选择以及其他一些基本算法方面的工作。 Quickselect用于计算未排序列表中的第k个最小元素,这个概念也可以用于寻找未排序列表中的中值。 这一次,我需要帮助来设计一种有效的技术来计算运行中位数,因为快速选择不是一个好的选择,因为它需要在每次列表更改时重新计算。因为快速选择每次都必须重新启动,所以它不能利用之前完成的计算,所以我正在寻找一种不同

  • 问题内容: 有没有一种方法可以计算出地面与手机之间的高度?我以为我可以用它来测量身高,但这篇文章建议您不要考虑误差率。如果是这样,我应该采取什么方法来测量手机的高度? 问题答案: GPS的精度足以使您将海拔高度提高到几米之内,但这可能并不是您想要的。 我想您可以在确定手机的麦克风/扬声器正好用加速度计指向地面的情况下尝试使用某种声纳。您可以假设使用STP,这可能会导致大约20%的错误。 您还可以告

  • 需要一种方法来完成我的'高级'计算器。我一直在用循环头脑Storm,但我困惑自己。任何关于如何实现操作数到数字的想法,而不只是嵌套一堆if语句和硬编码通过所有这些。 公共类计算器{ } }

  • 问题内容: 我怎样才能让一个多可编辑的文本里面?支持单行,我们需要在弹出窗口中创建一个多行文本编辑框。 问题答案: 这是很好的环境…