2015-02-10 77 views
3

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

两个子视图控制器被称为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)。

回答

2

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

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

  • 移至viewWillLayoutSubviews:我建议要么。此时,主视图的frame是可靠的。

  • 如果使用自动布局,完全不设置frame值,而是集setTranslatesAutoresizingMaskIntoConstraintsfalse这两个孩子的意见,然后添加约束(您可以在viewDidLoad做),其VFL将有效地:

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

作为最后的,不相关的细节,称addChildViewController时,你就大功告成了增加孩子意见后,不要忘记调用didMoveToParentViewController为每个这些子视图控制器。

+0

优秀 - 我把我的framing代码放在'viewWillLayoutSubviews'中,现在一切正常!非常感谢 - 并感谢关于'didMoveToParentViewController'的提示 - 完全忘了补充一点! – Jimmery 2015-02-10 15:26:00

相关问题