如何设置 UITextView 的高度以与其截断的内容完全匹配?
How can I set the height of a UITextView to exactly match its truncated content?
我有一个 UITextView
,我想将其高度限制在某个合理的值内,并在必要时截断文本。如何确保文本视图的高度与 truncated 内容的高度匹配?例如,如果我将高度设置为固定值,文本视图底部会有一些变量 space,这将影响其下方项目的布局。
有没有什么方法可以设置所需的高度,测量截断的文本,然后使用该测量值更精确地调整高度?有没有办法测量 UITextView
中 显示的 文本的高度?
编辑
我需要澄清一下:
- 我不需要截断文本的帮助。从屏幕截图中可以看出,文本已被截断。
- 我无法测量文本,因为我需要测量我无权访问的
truncated
文本。
- 文本视图底部的空白与
textcontainerInset
无关。
这是当前构建屏幕截图的方式:
- 文本设置为某个长字符串。
- 文本视图被人为限制在某个高度,比方说
300
。这会产生截断。
- 因为
300
不是行高的精确倍数,所以在最后截断的行下面有一些额外的space。
我想做什么:
将文本视图调整为 300
后,测量 截断的 文本的精确高度,以便我可以再次调整文本视图的大小以适应它没有额外的间距(例如,如果这是测量尺寸,则将其设置为 285
)。
或者,其他一些方法可以达到相同的最终结果。
我预计它会因为您的限制而被截断。所以需要在代码中计算文字大小并更新约束值:
let boundingRect = (textView.text as NSString).boundingRect(
with: maxSize,
options: .usesLineFragmentOrigin,
attributes: [ .font: textView.font ],
context: nil
)
heightConstraint.constant = boundingRect.height.rounded(.up)
这个操作的结果是浮点数,与像素无关。当通过约束计算视图大小时,它会四舍五入到像素(0.5 或 0.333...),这就是为什么我们需要自己对其进行四舍五入以排除不可预测的情况。要获得像素完美高度,您可以根据屏幕比例对其进行四舍五入:
textViewHeightConstraint.constant = (boundingRect.height * UIScreen.main.nativeScale).rounded(.up) / UIScreen.main.nativeScale
此外,正如下面提到的@nghiahoang,不要忘记将插图归零
textView.textContainerInset = .zero
这是我的 sample project
编译菲利普的解决方案并将inset.bottom设置为0
textView.textContainerInset.bottom = 0
直接说是不行的。如果你想这样做,你必须在 UITextView
后面拿 UILabel
。因为 UILabel
有 属性 可以根据文本自动扩展高度和宽度。现在。将 UILabel
的相等约束设置为 UItextview
。
什么应该是约束,让我一步步探索:
- 设置
UILabel
的前导和尾随。
- 修复
uILabel
. 的顶部约束
- 您不需要设置高度限制,但如果需要,您可以设置大于等于常数 20 或 30 的限制。
- 现在将 UITextview 的前导、尾随、顶部和高度约束设置为等于 UILabel。
现在,无论您在 UIlabel
中设置什么文本,也要将其添加到标签中。我过去没有。如果您发现任何问题,请在评论中提问
我有一个 UITextView
,我想将其高度限制在某个合理的值内,并在必要时截断文本。如何确保文本视图的高度与 truncated 内容的高度匹配?例如,如果我将高度设置为固定值,文本视图底部会有一些变量 space,这将影响其下方项目的布局。
有没有什么方法可以设置所需的高度,测量截断的文本,然后使用该测量值更精确地调整高度?有没有办法测量 UITextView
中 显示的 文本的高度?
编辑
我需要澄清一下:
- 我不需要截断文本的帮助。从屏幕截图中可以看出,文本已被截断。
- 我无法测量文本,因为我需要测量我无权访问的
truncated
文本。 - 文本视图底部的空白与
textcontainerInset
无关。
这是当前构建屏幕截图的方式:
- 文本设置为某个长字符串。
- 文本视图被人为限制在某个高度,比方说
300
。这会产生截断。 - 因为
300
不是行高的精确倍数,所以在最后截断的行下面有一些额外的space。
我想做什么:
将文本视图调整为 300
后,测量 截断的 文本的精确高度,以便我可以再次调整文本视图的大小以适应它没有额外的间距(例如,如果这是测量尺寸,则将其设置为 285
)。
或者,其他一些方法可以达到相同的最终结果。
我预计它会因为您的限制而被截断。所以需要在代码中计算文字大小并更新约束值:
let boundingRect = (textView.text as NSString).boundingRect(
with: maxSize,
options: .usesLineFragmentOrigin,
attributes: [ .font: textView.font ],
context: nil
)
heightConstraint.constant = boundingRect.height.rounded(.up)
这个操作的结果是浮点数,与像素无关。当通过约束计算视图大小时,它会四舍五入到像素(0.5 或 0.333...),这就是为什么我们需要自己对其进行四舍五入以排除不可预测的情况。要获得像素完美高度,您可以根据屏幕比例对其进行四舍五入:
textViewHeightConstraint.constant = (boundingRect.height * UIScreen.main.nativeScale).rounded(.up) / UIScreen.main.nativeScale
此外,正如下面提到的@nghiahoang,不要忘记将插图归零
textView.textContainerInset = .zero
这是我的 sample project
编译菲利普的解决方案并将inset.bottom设置为0
textView.textContainerInset.bottom = 0
直接说是不行的。如果你想这样做,你必须在 UITextView
后面拿 UILabel
。因为 UILabel
有 属性 可以根据文本自动扩展高度和宽度。现在。将 UILabel
的相等约束设置为 UItextview
。
什么应该是约束,让我一步步探索:
- 设置
UILabel
的前导和尾随。 - 修复
uILabel
. 的顶部约束
- 您不需要设置高度限制,但如果需要,您可以设置大于等于常数 20 或 30 的限制。
- 现在将 UITextview 的前导、尾随、顶部和高度约束设置为等于 UILabel。
现在,无论您在 UIlabel
中设置什么文本,也要将其添加到标签中。我过去没有。如果您发现任何问题,请在评论中提问