setNeedsDisplay 打破 UIView 的自动布局动画

Posted

技术标签:

【中文标题】setNeedsDisplay 打破 UIView 的自动布局动画【英文标题】:setNeedsDisplay breaks UIView's Auto Layout animations 【发布时间】:2014-04-10 13:59:46 【问题描述】:

我有一个 UIViewController 包含两个视图(来自两个子视图控制器):一个顶部内容视图和一个底部菜单弹出窗口。设置了约束,以便在底部菜单展开时,顶部内容视图被压扁:

所有约束都设置正确,因此当菜单展开和折叠时子视图的所有布局都正确。它甚至可以与 UIView animateWithDuration: 块一起正常工作(我正在调用 [self.view layoutIfNeeded] 以在动画期间更新子视图的布局)。

但是,内容视图区域中的视图之一是包含drawRect: 方法的自定义视图。每次此视图更新时,我都会致电setNeedsDisplay。一旦第一次调用setNeedsDisplay,这个视图的动画就会中断并且不会更新它的帧,直到再次调用setNeedsDisplay。我无法让它与所有其他视图一起制作动画!注释掉drawRect:方法,或者注释掉[self setNeedsDisplay],视图又和父视图完美动画了。

有人知道我做错了什么吗?

【问题讨论】:

没有看到任何代码,我敢打赌你在 drawRect 中的绘图与约束冲突。你能在这里添加一些代码吗? 不幸的是,我必须小心在这里添加代码,因为它是严格的 NDA 内容,但是发布 drawRect: 代码没有什么意义,因为仅仅包含没有任何内容的方法会导致要打破的约束。 如果里面什么都没有,整个方法都要注释掉。试试看会发生什么。我想知道你是否在任何时候使用 self.frame 。在 drawRect 内部,使用 self.bounds 是一种更好的做法 不抱歉...我的意思是,如果将整个方法注释掉,它就可以正常工作。如果我只添加一个drawRect:,即使其中没​​有任何内容,动画也会中断。你说self.bounds 而不是self.frame 很有趣——这背后有什么原因吗?我在drawRect: 的三个地方使用了self.frame,所以我现在将它们更改为self.bounds。不幸的是,它没有任何区别。 【参考方案1】:

我认为您应该让 ios 为您完成工作。 如果您的视图需要经常重绘,请设置视图的 contentMode:

yourView.contentMode = UIViewContentModeRedraw;

并且它应该在需要时重绘。

【讨论】:

以上是关于setNeedsDisplay 打破 UIView 的自动布局动画的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 setNeedsDisplay()

UIView setNeedsDisplay 没有效果?

使用 setNeedsDisplay 更新 UIView 不起作用

重新加载/刷新子视图 - setNeedsDisplay 不起作用

uiview 子类在第一次调用 setneedsdisplay 时显示为黑色矩形,但在那之后就可以了

SetNeedsDisplay 不工作