-2

在我最近开始只使用代码创建控制器之前,我一直主要使用故事板。

我按照我们的编码标准在loadView()函数中创建了一些子视图,其中第一行是super.loadView().

根据我的观察,在我调用之后super.loadView(),viewController 本身的框架self.view已经正确设置,这正是 viewController 的框架。

我更有经验的同事说,这在过去 100% 不起作用,它应该给你CGRectZero,也许我不应该依赖它。

我想听听其他人的更多建议。

这是我的示例项目设置: 1. 创建一个简单的项目 2. 在第一个 VC 中添加一个按钮 3. 通过代码创建第二个 VC,loadView()在第二个 VC 中覆盖函数,调用super.loadView()那里并打印self.view.bounds下一行 4.self.present或使用 VC1 中的导航控制器在按钮动作中呈现或推送到 VC2 5. 它总是给我第二个 VC 的正确框架。

请告诉我。

- - - - - - 编辑 - - - - - - -

为了澄清我的问题,我知道生命周期功能喜欢viewDidLayoutSubviewslayoutSubViews返回正确的视图。我不是在问这些。

我的问题是为什么loadView() 现在给我返回正确的框架。

4

2 回答 2

2

不幸的是,我无法就幕后发生的事情提供任何见解 - 但我能做的是告诉你,根据文档,你不应该打电话super.loadView()

您可以覆盖此方法以手动创建视图。如果您选择这样做,请将视图层次结构的根视图分配给视图属性。您创建的视图应该是唯一的实例,并且不应与任何其他视图控制器对象共享。此方法的自定义实现不应调用 super。

(强调我的)

于 2019-05-07T01:12:21.860 回答
0

1)我一直主要使用故事板,直到我最近开始只使用代码创建控制器。

我按照我们的编码标准在 loadView() 函数中创建了一些子视图,其中第一行是 super.loadView()。

  • 由于您使用的是 xibs,因此请在 loadView 上使用 viewDidLoad,因为If you use Interface Builder to create your views and initialize the view controller, you must not override this method.如 Apple Docs 中的 loadView 所述。

2)我更有经验的同事说,这在过去 100% 不起作用,它应该给你 CGRectZero,也许我不应该依赖它。

我想听听其他人的更多建议。

  • viewController.view 的正确框架将在何时viewWillLayoutSubviews被调用。至于它的子视图,viewDidLayoutSubviews是你需要的
  • loadView 和 viewDidLoad 中的视图框架是 Nib 框架大小。您的同事是正确的,它不会返回正确的尺寸。这在运行 iPad 应用程序时很明显

另外,这个问题与您的问题直接相关: 为什么我必须在 viewDidLoad 中手动设置我的视图框架?

于 2019-05-07T01:24:13.797 回答