ios - 相同的 View Controller 显示不同

标签 ios swift uiviewcontroller

我有两个 subview Controller ,据我所知它们是相同的,但是其中一个出现了意外行为。

这两个 subview Controller 称为 MenuLoggedInViewControllerMenuLoggedOutViewController。他们的容器 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
}

MenuLoggedInViewControllerMenuLoggedOutViewController 在它们的 swift 文件中有几乎相同的模板代码:

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

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

除了更改背景颜色外,我没有接触过 .xib 文件。在完成 .xib 文件的设置后,它们似乎都是一样的。如果可以的话,我不会靠近 Storyboard,所以我对它不太熟悉。但是我花了很长时间仔细检查两个 .xib 文件的所有值,除了背景颜色之外,我可以检测到它们之间没有区别。

<code>MenuLoggedInViewController</code> produces this:

如您所见,黑色的 MenuLoggedInViewController 紧贴下方的白色 View Controller 。这是有意的。

<code>MenuLoggedOutViewController</code> produces this:

灰色背景是包含 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/

相关文章:

ios - 从场景加载节点后应用程序卡住

Swift:为 UIView 类添加手势识别器

ios - Bitcode WatchOS3 - 如何生成

ios - 使用分段 Controller 重叠 UIView 问题

ios - MVVM 与 RxSwift

ios - 如何在特定区域使用drawRect?

swift - 如何删除导航栏标题?

没有 Storyboard或图像的 iOS 启动图像

swift - 将容器与页面 View Controller 一起使用

ios - OpenGL ES 1.1 iPhone5+ IOS 8 黑屏