根据-[UIView setNeedsLayout]
的{{1}}:
由于此方法不强制立即更新,而是等待下一个更新周期,因此可以在更新任何视图之前使用它来使多个视图的布局无效。此行为允许您将所有布局更新合并到一个更新周期,这通常会提高性能。
听起来不错 - 但是当我使用setNeedsLayout
而没有调用layoutIfNeeded
时,我发现我的控件并没有自行解决。我曾希望在下次显示控件之前发生“更新周期”,但我想这不是它的工作原理。那么什么是“更新周期”?什么时候发生?
答案 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