UITextView 的内容大小在环绕排除路径后没有改变
Posted
技术标签:
【中文标题】UITextView 的内容大小在环绕排除路径后没有改变【英文标题】:Content size of UITextView not changing after wrapping around exclusion path 【发布时间】:2018-01-03 14:11:38 【问题描述】:我有一个UITextView
,上面有一个UIImageView
。我有文本视图将其文本包裹在图像周围(在视图控制器中):
override func viewDidLayoutSubviews()
let imageBezierPath = UIBezierPath(rect: imageRect)
overviewTextView.textContainer.exclusionPaths = [imageBezierPath]
这可以很好地包装文本,但问题是:我在 UIStackView
中有文本视图(下面的 lorem ipsum),禁用了滚动,我在它下面有项目(“下面的标签”)。我希望它的高度随着它的包裹而扩大,但事实并非如此。我在设置exclusionPaths
属性之前和之后打印了文本视图的contentSize.height
,但没有看到任何变化。
你可以在 lorem ipsum 的底部看到我放了一些英文以便更容易看出文本视图被截断了。
这是UITextView
的预期行为吗?我该怎么做才能更新contentSize
,或者手动计算文本现在占用了多少空间?
更新
在@DonMag 的帮助下,我制作了一个游乐场来重现该问题。当您点击按钮以切换排除路径时,文本不会按应有的方式换行。
https://gist.github.com/abbeycode/b40ade1f23a8946a12ad816e1bc0f2b1
【问题讨论】:
嗯...对我来说似乎工作正常。这是一个可以放入 Playground 页面的示例:gist.github.com/DonMag/e79e40f23fd034921cbdbbca2e584b49 ...如果您点击按钮,它将打印文本视图的.contentSize
。更改 imageRect
的高度(代码中的第 32 行)似乎可以正确更改包装和 .contentSize
。
@DonMag 谢谢,这非常有帮助。看起来我的问题必须与我设置的约束有关(或者它位于滚动视图内的堆栈视图内)。当我知道更多时,我会更好地找出问题所在并更新问题。
@DonMag 我想可能是因为我使用了Interface Builder,而操场在viewDidLoad
中设置了约束。试试我修改后的游乐场:gist.github.com/abbeycode/b40ade1f23a8946a12ad816e1bc0f2b1 ... 点击按钮切换换行,我看到了相同的行为。我尝试强制重新布局,但没有帮助
Dov - 看起来很奇怪。当您设置exclusionPaths
时,文本视图似乎没有收到“您需要更改某些内容”消息。不知道这是否是一个错误,或者我只是不知道打电话的正确方式。如果您愿意,这是一种解决方法 - 这是您的确切要点,我只是在您更改 exclusionPaths
后添加了几行“清除和替换文本” - 似乎有效:gist.github.com/DonMag/a97de9749f5915615e8a286aac5e3ec4
【参考方案1】:
不确定这是错误还是“标准”行为,或者是否有我不知道的“强制更新”命令,但是...
这是让文本视图重新计算其 contentSize 的解决方法。更改 .exclusionPaths
时,您可以清除并替换文本:
@objc
func didTap(_ sender: Any?) -> Void
if overviewTextView.textContainer.exclusionPaths.first != nil
overviewTextView.textContainer.exclusionPaths = []
else
let imageBezierPath = UIBezierPath(rect: imageRect)
overviewTextView.textContainer.exclusionPaths = [imageBezierPath]
let s = overviewTextView.text
overviewTextView.text = " "
overviewTextView.text = s
Playground 可运行完整版在这里:https://gist.github.com/DonMag/a97de9749f5915615e8a286aac5e3ec4
【讨论】:
谢谢!我为此提交了一个雷达:rdar://36330838 如果用户在使用此方法时正在编辑,您可能还需要保存并重置selectedTextRange
。以上是关于UITextView 的内容大小在环绕排除路径后没有改变的主要内容,如果未能解决你的问题,请参考以下文章
具有边缘到边缘排除路径的 UiTextView 导致所有文本消失
UITextView textContainer排除路径在视图控制器的中间时不起作用