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
}