2015-02-10 73 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

相關問題