7

根据以下文档-[UIView setNeedsLayout]

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

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

4

4 回答 4

3

“更新周期”发生在当前运行循环周期的末尾。

setNeedsLayout 必须在主线程(主运行循环)上调用。

于 2012-07-02T12:28:16.053 回答
0

这很奇怪,我使用了很多我更改的自定义绘制的东西,并经常调用“[self setNeedsLayout]”,而我从来不需要调用“layoutIfNeeded”......

你确定你的“drawRect”没有问题吗?在您调用“setNeedsLayout”之前,它的数据可能还没有准备好。

以下线程的第一个答案可以进一步帮助您。

于 2012-06-29T17:31:45.397 回答
-1

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

于 2012-07-02T11:42:09.097 回答
-1

请改用 layoutIfNeeded,这会触发立即布局更新。

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

于 2016-11-28T07:00:21.027 回答