在排除路径环绕后,UITextView的内容大小不会改变

时间:2018-01-03 14:11:39

标签: ios autolayout uitextview

我有一个UITextView,其上面有一个UIImageView。我有文本视图将其文本包装在图像周围(在视图控制器中):

override func viewDidLayoutSubviews() {
    let imageBezierPath = UIBezierPath(rect: imageRect)
    overviewTextView.textContainer.exclusionPaths = [imageBezierPath]
}

这样可以很好地包装文本,但是这里有问题:我在UIStackView中有文本视图(下面的lorem ipsum),滚动禁用,我有下面的项目(“下面的标签”) 。我希望它的高度随着它的变化而扩大,但事实并非如此。我在设置contentSize.height属性之前和之后打印了文本视图的exclusionPaths,但看不到任何更改。

Text that wraps, but doesn't continue

你可以在lorem ipsum的底部看到我放了一些英文,以便更容易判断文本视图是否被截断。

这是UITextView的预期行为吗?如何更新contentSize或手动计算文本占用的空间量,我该怎么做?

更新

在@DonMag的帮助下,我做了一个游乐场来重现这个问题。当您点击按钮切换排除路径时,文本不会按照应有的方式进行换行。

https://gist.github.com/abbeycode/b40ade1f23a8946a12ad816e1bc0f2b1

1 个答案:

答案 0 :(得分:2)

不确定这是一个错误,还是“标准”行为,或者是否存在我不知道的“强制更新”命令,但是......

以下是一种解决方法,可让文本视图重新计算其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