相同的视图控制器显示不同

时间:2015-02-10 12:50:17

标签: ios swift uiviewcontroller

我有两个子视图控制器,据我所知是相同的,但其中一个是意外的。

两个子视图控制器称为MenuLoggedInViewControllerMenuLoggedOutViewController。它们的容器视图控制器具有以下代码:

override func viewDidLoad() {
    super.viewDidLoad()

    // i comment out one of these two lines to produce the different results:
    self.masterView = MenuLoggedOutViewController(nibName: "MenuLoggedOutViewController", bundle: nil)
    // self.masterView = MenuLoggedInViewController(nibName: "MenuLoggedInViewController", bundle: nil)

    self.detailView = RootViewController(nibName: "RootViewController", bundle: nil)
    self.masterViewFrame = CGRectMake(0, 0, self.view.frame.width, 50)
    self.detailViewFrame = CGRectMake(0, 50, self.view.frame.width, self.view.frame.height - 50)
    self.addChildViewController(masterView!)
    self.addChildViewController(detailView!)
    self.view.addSubview(masterView!.view)
    self.view.addSubview(detailView!.view)

    masterView!.view.frame = masterViewFrame
    // masterView!.view.bounds = masterViewFrame // - i tried this and it made no difference
    detailView!.view.frame = detailViewFrame
}

MenuLoggedInViewControllerMenuLoggedOutViewController在其快速文件中有相同的模板代码:

override func viewDidLoad() {
    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

除了更改背景颜色外,我没有触及.xib个文件。完成.xib文件的设置后,他们似乎都是一样的。如果我可以提供帮助,我就不会去故事板附近,所以我对它不太熟悉。但是我花了很长时间仔细检查两个.xib文件的所有值,除了背景颜色之外,它们之间没有区别,我可以检测到。

<code>MenuLoggedInViewController</code> produces this:

正如您所看到的,黑色MenuLoggedInViewController贴合下方的白色视图控制器。这是有目的的。

<code>MenuLoggedOutViewController</code> produces this:

灰色背景是包含视图控制器的颜色。正如你所看到的那样,黑色MenuLoggedOutViewController只能走得那么远。

任何人都可以向我解释,尽管几乎完全相同并且使用几乎相同的代码调用,为什么MenuLoggedOutViewController无法正常显示?

应该注意的是,如果屏幕旋转到一侧然后再回到肖像,MenuLoggedOutViewController会自行纠正。然后MenuLoggedOutViewController看起来应该如此(例如MenuLoggedInViewController)。

1 个答案:

答案 0 :(得分:2)

很难确切地知道发生了什么。如果你真的想要,我建议使用NSStringFromCGRect并检查各种frame值,我怀疑你会看到发生了什么。

但关键的概念问题是此代码正在调整frame中的viewDidLoad值,但此时frame值不可靠。我建议:

  • 将子frame值的调整移至viewWillLayoutSubviews。此时,主视图的frame是可靠的。

  • 如果使用自动布局,请不要设置frame值,而是将setTranslatesAutoresizingMaskIntoConstraints设置为false以获取这两个子视图,然后添加约束(你可以在viewDidLoad)做什么,其VFL实际上是:

    V:|[master(50)][detail]|
    H:|[master]|
    H:|[detail]|
    

作为最终的,不相关的细节,在您添加子视图后调用addChildViewController时,不要忘记为每个子视图控制器调用didMoveToParentViewController