我有两个 subview Controller ,据我所知它们是相同的,但是其中一个出现了意外行为。
这两个 subview Controller 称为 MenuLoggedInViewController
和 MenuLoggedOutViewController
。他们的容器 View Controller 具有以下代码:
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
在它们的 swift 文件中有几乎相同的模板代码:
override func viewDidLoad() {
super.viewDidLoad()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
除了更改背景颜色外,我没有接触过 .xib
文件。在完成 .xib
文件的设置后,它们似乎都是一样的。如果可以的话,我不会靠近 Storyboard,所以我对它不太熟悉。但是我花了很长时间仔细检查两个 .xib
文件的所有值,除了背景颜色之外,我可以检测到它们之间没有区别。
如您所见,黑色的 MenuLoggedInViewController
紧贴下方的白色 View Controller 。这是有意的。
灰色背景是包含 View Controller 的颜色。如您所见,黑色的 MenuLoggedOutViewController
只能向下移动这么远。
任何人都可以向我解释一下,尽管几乎相同并使用几乎相同的代码调用,为什么 MenuLoggedOutViewController
无法正确显示?
应该注意的是,如果屏幕旋转到侧面然后再回到纵向,MenuLoggedOutViewController
会自行更正。然后 MenuLoggedOutViewController
看起来应该是这样(比如 MenuLoggedInViewController
)。
最佳答案
很难准确判断发生了什么。如果您真的想要,我建议您使用 NSStringFromCGRect
并检查各种 frame
值,我想您会看到发生了什么。
但关键的概念问题是这段代码正在调整 viewDidLoad
中的 frame
值,但 frame
值在那个时候并不可靠观点。我建议:
将子
frame
值的调整移动到viewWillLayoutSubviews
。那时,主视图的frame
是可靠的。如果使用自动布局,根本不要设置
frame
值,而是将setTranslatesAutoresizingMaskIntoConstraints
设置为false
这两个 subview 然后添加约束(您可以在viewDidLoad
中执行),其 VFL 实际上是:V:|[master(50)][detail]| H:|[master]| H:|[detail]|
作为最后一个不相关的细节,当调用 addChildViewController
时,在添加完 subview 后,不要忘记为每个 subview 调用 didMoveToParentViewController
View Controller 。
关于ios - 相同的 View Controller 显示不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28432138/