什么会触发 viewDidLayoutSubviews 并寻找一个好的模式来启动子视图框架

Posted

技术标签:

【中文标题】什么会触发 viewDidLayoutSubviews 并寻找一个好的模式来启动子视图框架【英文标题】:What will trigger viewDidLayoutSubviews and look for a good pattern for initing subviews frame 【发布时间】:2015-03-30 07:48:31 【问题描述】:

我有一个与 Storyboard 中的自动布局相结合的应用,而一些旧的纯代码视图没有自动布局

在我的 MainViewController 中,我尝试在 viewDidLayoutSubviews 和 viewWillAppear 中初始化边界、约束等子视图。因为自动布局问题,我发现在 viewDidLayoutSubviews 中进行初始化是获得父视图边界正确边界的最佳位置。

但是,我注意到 viewDidLayoutSubviews 会在完全稳定下来之前被调用 2-3 次,所以我必须处理如果这是我第一次初始化我的子视图,或者如果在自动布局后某些约束发生变化或大小发生变化,则更新我的框架.

现在我想改进它,但我无法弄清楚是什么在调用 viewDidLayoutSubviews 好几次。

我想要的最好的事情是只调用一个 viewDidLayoutSubviews,然后我可以获得正确的大小来初始化我的子视图。

我试过搜索,但有人说 viewDidLayoutSubviews 是系统调用的,所以不能保证它会被调用多少次。如果是这种情况,使用自动布局子视图进行初始化的正确模式是什么?

【问题讨论】:

【参考方案1】:

viewDidLayoutSubiews 在创建 viewController 期间被多次调用 - 在任何调用了 setNeedsLayoutsetNeedsDisplayWithRect: 的视图上每个运行循环一次,但在之后,在旋转设备、滚动等情况下也会调用等等。看到这个link for more details。

基本上,每次主视图的布局更改时都会调用它,因此您应该非常小心添加到此方法的代码,因为它也可能会被执行多次。

【讨论】:

我的问题是项目中的一些旧代码正在做纯代码初始化,所以它需要准确的尺寸,但是在视图控制器布局稳定下来之前,我没有机会获得正确的尺寸。有什么方法可以知道自动布局是否全部完成,以便获得正确的大小并开始初始化我的子视图? 在您的 viewDidLoad、viewDidLayoutSubviews、viewWillAppear 和 viewDidAppear 中添加一些日志,然后查看您的视图大小最后一次更改的时间。 最后一个是view did layout,这就是我郁闷的原因 viewWillAppear 之后会被调用吗?如果是这样,您可以在那里初始化您的视图。 不,会先出现,然后是几个布局调用,DidLayout调用中的DidLayout

以上是关于什么会触发 viewDidLayoutSubviews 并寻找一个好的模式来启动子视图框架的主要内容,如果未能解决你的问题,请参考以下文章

触发器级联为啥会失败

viewController的生命周期

java基础—常用的GC策略,什么时候会触发YGC,什么时候触发FGC?

什么比率的推送通知会触发 TooManyRequests 错误? [复制]

[react] render在什么时候会被触发?

HashMap什么时候会触发链表转红黑树