gpt4 book ai didi

ios - 为什么呈现模态 UIViewController 会导致呈现 Controller 上的 setNeedsLayout?

转载 作者:行者123 更新时间:2023-12-01 18:15:14 26 4
gpt4 key购买 nike

似乎呈现和关闭 View Controller 都会提示 呈现 View 以布局其 subview 和/或更新其约束。对于繁重的 View 层次结构,这会引入性能问题。再次 - 这是现有的,当前显示的 View 。正在创建和显示的模态非常轻巧。

无论我是否使用自动布局(如在我的示例项目中),都会发生这种情况。

我建了一个demo project这近似于我正在开发的应用程序。有一个带有水平滚动的主父 Controller UIScrollView .将多个子 Controller 添加到父 Controller ,并将它们的 View 添加到 ScrollView 并使用 NSLayoutConstraint 排列s。每个 subview 本身都有一个 subview ,一个简单的 UIView , 也有约束。

在导航栏中,有一个用于启动模式的按钮。出现时,父 Controller 调用 setNeedsLayout在每个 subview 上,多次。在我的演示项目中,我覆盖了 setNeedsLayout访问时记录。关闭模态时也会发生同样的情况。打开和关闭模态几次并观察控制台。

我看不出为什么需要新的布局,而且对于更复杂的 View ,我发现有数百个这样的调用正在触发,对性能有明显的影响。

请注意,当布局代码来自 ChildView省略,setNeedsLayout不叫。我鼓励您注释掉约束并查看日志记录中的差异。

为什么会这样?在呈现和关闭模式时如何防止不必要的布局传递?

最佳答案

首先,您正在登录 setNeedsLayout ,这只是一个标记机制,还没有真正产生任何工作。多次调用 setNeedsLayout可能只会触发一个布局。您应该登录 -[UIView layoutSubviews]-[UIViewController viewDidLayoutSubviews]相反,因为这些是真正的繁重工作发生的地方。

其次,与布局相关的方法意味着在演示过程中被反复快速地调用,因为:

  • 窗口需要旋转其所有 subview 以尊重呈现的 View Controller 的首选界面方向。
  • 动画需要知道 View 的初始和最终状态。
  • 无论出于何种原因在父 View 上发生布局时,它们的所有 subview (可能包括 View Controller 的 View )当然也需要更新它们的布局。

  • 如果你想尽量减少布局 channel 的数量,你可以尝试放弃使用 presentViewController:animated:而是使用 addChildViewController:并手动为必要的 View 设置动画。但即便如此,您仍然可能触发父 Controller 的布局。

    关于ios - 为什么呈现模态 UIViewController 会导致呈现 Controller 上的 setNeedsLayout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22601118/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com