我有两个子视图控制器,据我所知是相同的,但其中一个是意外的。
两个子视图控制器称为MenuLoggedInViewController
和MenuLoggedOutViewController
。它们的容器视图控制器具有以下代码:
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
}
MenuLoggedInViewController
和MenuLoggedOutViewController
在其快速文件中有相同的模板代码:
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
除了更改背景颜色外,我没有触及.xib
个文件。完成.xib
文件的设置后,他们似乎都是一样的。如果我可以提供帮助,我就不会去故事板附近,所以我对它不太熟悉。但是我花了很长时间仔细检查两个.xib
文件的所有值,除了背景颜色之外,它们之间没有区别,我可以检测到。
正如您所看到的,黑色MenuLoggedInViewController
贴合下方的白色视图控制器。这是有目的的。
灰色背景是包含视图控制器的颜色。正如你所看到的那样,黑色MenuLoggedOutViewController
只能走得那么远。
任何人都可以向我解释,尽管几乎完全相同并且使用几乎相同的代码调用,为什么MenuLoggedOutViewController
无法正常显示?
应该注意的是,如果屏幕旋转到一侧然后再回到肖像,MenuLoggedOutViewController
会自行纠正。然后MenuLoggedOutViewController
看起来应该如此(例如MenuLoggedInViewController
)。
答案 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
。