Ios 相同的视图控制器显示方式不同

Ios 相同的视图控制器显示方式不同,ios,swift,uiviewcontroller,Ios,Swift,Uiviewcontroller,我有两个子视图控制器,据我所知它们是相同的,但是其中一个的行为出乎意料 这两个子视图控制器分别称为MenuLoggedInViewController和MenuLoggedOutViewController。其容器视图控制器具有以下代码: override func viewDidLoad() { super.viewDidLoad() // i comment out one of these two lines to produce the different result

我有两个子视图控制器,据我所知它们是相同的,但是其中一个的行为出乎意料

这两个子视图控制器分别称为
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
在其swift文件中具有几乎相同的模板代码:

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

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}
除了更改背景颜色外,我没有触摸
.xib
文件。在检查了
.xib
文件的设置之后,它们似乎都是相同的。如果我能帮忙的话,我不会靠近故事板,所以我对它不太熟悉。但是我花了很长时间仔细检查了两个
.xib
文件的所有值,除了背景颜色之外,它们之间没有任何差异

MenuLoggedInViewController生成以下内容:“>

正如您所看到的,黑色的
menulogedinViewController
紧贴着下面的白色视图控制器。这是有意的

MenuLoggedOutViewController生成以下命令:“>

灰色背景是包含视图控制器的颜色。正如您所看到的,黑色的
菜单loggedoutviewcontroller
只会下降这么多

有谁能向我解释一下,尽管实际上完全相同,并且调用的代码也几乎相同,为什么
菜单上的
无法正确显示


需要注意的是,如果将屏幕旋转到一侧,然后再旋转回纵向,则
菜单栏的视频控制器会自动进行校正。然后
menulogedoutviewcontroller
看起来应该是这样的(就像
menulogedingviewcontroller
)。

很难准确地判断到底发生了什么。如果您真的愿意,我建议您使用
NSStringFromCGRect
并检查各种
frame
值,我怀疑您会看到发生了什么

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

  • 将子
    值的调整移动到
    视图将布局子视图
    。此时,主视图的
    框架
    是可靠的

  • 如果使用自动布局,则根本不要设置
    值,而是将这两个子视图的
    设置TranslatesAutoResizengMaskintoConstraints
    设置为
    false
    ,然后添加约束(可以在
    viewDidLoad
    中执行),其VFL实际上是:

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


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

非常好-我将框架代码放在
viewWillLayoutSubviews
中,现在一切正常!非常感谢-感谢您提供的关于didMoveToParentViewController
的提示-完全忘了添加它!