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排除路径在视图控制器的中间时不起作用

通过 UITextView 内容大小调整 UITableView 单元格的大小

如何根据内容调整 UITextView 的大小?

如何根据内容调整 UITextView 的大小,宽度固定

如何让 UITextView 根据内容动态调整自身大小