在展示ViewController时,我希望视图生命周期符合以下顺序:

  • viewDidLoad()

  • viewWillAppear

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear()

注意:4到5之间可以是viewWill / viewDidLayoutSubviews()的更多迭代 . 换句话说,我希望viewDidLayoutSubview在第一个viewDidAppear之前触发 .

为了测试这个,我将一个childViewController添加到一个UIViewController子类,并调用addSubview来添加childViewController的视图 .

override func viewDidLoad() {
    super.viewDidLoad()

    let childVC = ChildViewController()
    self.addChildViewController(childVC)
    self.view.addSubview(childVC.view)

}

当我打印出视图方法时,这会产生预期的结果:

  • viewDidLoad()

  • viewWillAppear

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear

当我在UIPageViewController子类上使用setViewController时:

override func viewDidLoad() {
    super.viewDidLoad()

    let childVC = ChildViewController()
    self.setViewControllers([childVC], direction: .forward, animated: true, completion: nil)

}

我总是在第一个LayoutSubviews方法之前执行viewDidAppear:

  • viewDidLoad()

  • viewWillAppear

  • viewDidAppear

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

有人能解释为什么会出现这种情况吗

----进一步观察---

我还在childViewController的日志中添加了willMove和DidMove方法 . 初步测试的结果:

willMove(toParentViewController :)

  • viewDidLoad()

  • viewWillAppear

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewDidAppear

UIPageViewController的结果:

  • viewDidLoad()

  • viewWillAppear

  • viewDidAppear didMove(toParentViewController :)

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

  • viewWillLayoutSubviews()

  • viewDidLayoutSubviews()

所以看起来好像setViewController调用了moveToParentViewController,这可能是它之前调用viewDidAppear的原因 .