我有一个UITextView
,其上面有一个UIImageView
。我有文本视图将其文本包装在图像周围(在视图控制器中):
override func viewDidLayoutSubviews() {
let imageBezierPath = UIBezierPath(rect: imageRect)
overviewTextView.textContainer.exclusionPaths = [imageBezierPath]
}
这样可以很好地包装文本,但是这里有问题:我在UIStackView
中有文本视图(下面的lorem ipsum),滚动禁用,我有下面的项目(“下面的标签”) 。我希望它的高度随着它的变化而扩大,但事实并非如此。我在设置contentSize.height
属性之前和之后打印了文本视图的exclusionPaths
,但看不到任何更改。
你可以在lorem ipsum的底部看到我放了一些英文,以便更容易判断文本视图是否被截断。
这是UITextView
的预期行为吗?如何更新contentSize
或手动计算文本占用的空间量,我该怎么做?
更新
在@DonMag的帮助下,我做了一个游乐场来重现这个问题。当您点击按钮切换排除路径时,文本不会按照应有的方式进行换行。
https://gist.github.com/abbeycode/b40ade1f23a8946a12ad816e1bc0f2b1
答案 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