Ios 环绕排除路径后,UITextView的内容大小未更改

Ios 环绕排除路径后,UITextView的内容大小未更改,ios,autolayout,uitextview,Ios,Autolayout,Uitextview,我有一个UITextView,上面有一个UIImageView。我让文本视图将其文本环绕图像,如下所示(在视图控制器中): 这可以很好地包装文本,但问题是:我在UIStackView中有文本视图(下面是lorem ipsum),并且禁用了滚动,下面有项目(“下面的标签”)。我希望它的高度随着它的缠绕而扩大,但事实并非如此。在设置排除路径属性前后,我打印了文本视图的contentSize.height,但没有看到任何更改 您可以在lorem ipsum的底部看到,我在其中添加了一些英语,以便更容

我有一个
UITextView
,上面有一个
UIImageView
。我让文本视图将其文本环绕图像,如下所示(在视图控制器中):

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

您可以在lorem ipsum的底部看到,我在其中添加了一些英语,以便更容易判断文本视图是否被截断

这是
UITextView
的预期行为吗?我可以如何更新
contentSize
,或者手动计算文本现在占用的空间

更新

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


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

下面是一个让文本视图重新计算其contentSize的解决方法。更改
.exclusionpath
时,您可以清除并替换文本:

@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

}

这里有一个游乐场可运行的完整版本:

Hmmm。。。对我来说似乎很好。下面是一个可以放在操场页面中的示例:。。。如果点击该按钮,它将打印文本视图的
.contentSize
。更改
imageRect
(代码中的第32行)的高度似乎可以正确地更改包装和
。contentSize
@DonMag谢谢,这非常有用。看起来我的问题一定与我设置的约束有关(或者它在滚动视图中的堆栈视图中)。当我知道更多信息时,我会更好地找出哪里出了问题,并更新问题。@DonMag我想可能是因为我使用了Interface Builder,游乐场在
viewDidLoad
中设置了约束。试试我修改过的游乐场:…点击按钮切换包装,我看到了相同的行为。我试图强迫重新布局,但这无助于DOV-看起来很奇怪。设置
排除路径时,文本视图似乎没有收到“您需要更改某些内容”消息。我不知道这是不是一个错误,或者我只是不知道该打什么电话。如果您愿意,这里有一个解决方法-这是您的确切要点,在您更改
排除路径后,我刚刚添加了几行“清除并替换文本”
-似乎有效:谢谢!我为此提交了雷达:rdar://36330838If 用户使用此方法进行编辑时,您可能还需要保存并重置
selectedTextRange
@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

}