UIViewController生命周期功能loadview()框架问题

时间:2019-05-07 00:17:05

标签: ios uiviewcontroller loadview

我一直主要使用情节提要,直到最近我转向只用代码创建控制器。

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

从观察到的结果来看,在我叫super.loadView()之后,self.view的框架已经使用viewController本身正确设置了,而这正是viewController的框架。

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

我想听听其他人的建议。

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

请让我知道。

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

为澄清我的问题,我知道诸如viewDidLayoutSubviewslayoutSubViews之类的生命周期函数可以返回正确的视图。我问这些。

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

2 个答案:

答案 0 :(得分:2)

不幸的是,我无法提供有关幕后情况的任何见解-尽管我可以做的是告诉您,根据documentation,您不应该打电话给super.loadView()

  

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

(强调我的)

答案 1 :(得分:0)

1)我一直主要使用情节提要,直到最近我转向只用代码创建控制器。

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

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

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

我想听听其他人的建议。

  • viewController.view的正确框架将是在调用viewWillLayoutSubviews时。至于其子视图,viewDidLayoutSubviews是您所需要的
  • loadli和viewDidLoad内部的
  • 视图框架是Nib框架大小。您的同事是正确的,它将不会返回正确的大小。在运行以模态显示的viewcontroller的iPad应用程序时,或者在与xib设备中的设备尺寸不同的屏幕尺寸上运行您的应用程序时,这一点很明显

另外,这个问题与您的问题直接相关: Why am I having to manually set my view's frame in viewDidLoad?