在UIView布局中,什么是“更新周期”?

时间:2012-05-31 16:19:52

标签: uiview

根据-[UIView setNeedsLayout]的{​​{1}}:

  

由于此方法不强制立即更新,而是等待下一个更新周期,因此可以在更新任何视图之前使用它来使多个视图的布局无效。此行为允许您将所有布局更新合并到一个更新周期,这通常会提高性能。

听起来不错 - 但是当我使用setNeedsLayout而没有调用layoutIfNeeded时,我发现我的控件并没有自行解决。我曾希望在下次显示控件之前发生“更新周期”,但我想这不是它的工作原理。那么什么是“更新周期”?什么时候发生?

4 个答案:

答案 0 :(得分:3)

“更新周期”发生在当前run loop周期结束时。

setNeedsLayout 必须在主线程(主runloop)上调用。

答案 1 :(得分:0)

这很奇怪,我使用了很多自定义绘制的东西,我更改并调用了“[self setNeedsLayout]”,我从来没有打过“layoutIfNeeded”......

你确定你的“drawRect”没问题,没有问题吗?在你调用“setNeedsLayout”之前,它的数据可能尚未就绪。

以下thread的第一个答案可以帮助您。

答案 2 :(得分:0)

我认为UIKit中没有这么明显的错误。作为你,我会检查我的代码是否调用了我所覆盖的所有基本方法。特别是在有问题的对象的等级父母中。如果这没有帮助,我会用一些标准视图替换自定义父视图,以查看问题是否仍然存在。这有助于隔离问题。

答案 3 :(得分:0)

使用layoutIfNeeded代替,它会立即触发布局更新。

setNeedsLayout只是将布局调度到处理程序,执行到下一个更新周期。 请参阅:http://www.iosinsight.com/setneedslayout-vs-layoutifneeded-explained