2017-08-15 66 views
-1

我有Storyboard和XIB VCs。剛剛體驗一下:爲什麼從xib初始化VC視圖的框架不是MainScreen的大小?

當從XIB初始化VC時,其視圖的大小是{600,600},但是如果從Storyboard初始化,其視圖的大小與UIScreen.main().bounds相同。

爲了深入挖掘,似乎從故事板初始化時,視圖獲得了屬性view.window != nil,而如果從XIB初始化它的window == nil。也許這是奇怪的大小的原因。

我的問題是:爲什麼,以及如何從xib獲得VC的視圖獲得了正確大小的MainScreen?

我試圖像這樣手動設置:vc.view.frame = UIScreen.main.bounds,它的工作原理。但是,這也會觸發viewDidLoad,我在那裏爲我的內容做了一些設置,並且當時的IBOutlet尚未加載,並且每個設置都是錯誤的!

因此,提出了一個獎勵問題:如何從XIB初始化後強制加載IBOutlet?

一些示例代碼造成這樣的問題:

import MFSideMenu 

... 
// initialize from somewhere else and push it to menu.containerVC.centerVC 
let vc = MyVC.init(nibName:MyVC.className, bundle:self.nibBundle) 
... 

// This method is from subclass of MFSideMenuVC 
func pushCenterVC(vc: UIViewController!) { 

    // This cause the setup in vc.viewDidLoad go wrong 
    // If side menu is load for the first time, it doesn't have its window yet. 
    if self.view.window != nil { 
     vc.view.frame = self.view.window.bounds 
    } 

    self.menuContainerViewController.centerViewController = vc 

    // If I put it here, MFSideMenu will create an ugly shadow because of wrong initilize frame size. 
    // if self.view.window != nil { 
    //  vc.view.frame = self.view.window.bounds 
    // } 
} 
+0

您可能將您的xib文件設置爲使用大小類別。尺寸等級爲600x600,即使是故事板 –

+0

@YunusErenGüzel好的,我的應用程序假設支持多種設備,那麼如果沒有AutoLayout和SizeClass的幫助,我們該怎麼做呢? – Eddie

+0

你不能改變它。這是它應該如何工作的。爲什麼這是你的問題? –

回答

0

我的問題是:爲什麼,以及如何從廈門國際銀行獲得VC的觀點得到了MainScreen的正確尺寸是多少?

當尺寸代碼尚未運行時,您期待正確的尺寸。在 func viewDidLayoutSubviews()運行後,視圖將具有正確的大小。在此之前使用視圖的大小隻是要求麻煩,而您依賴的是未定義的行爲,這些行爲可能會隨着新的iOS版本發生變化。

如何從XIB初始化後強制加載IBOutlet?

輕鬆地訪問視圖控制器的init()方法中的視圖。例如請求視圖的大小,視圖將被加載。

+0

但爲什麼當init vc從storyboard獲得正確大小的視圖?再加上,你可以在第二個答案中更具體(請問視圖的大小)?是不是讓'rect = vc.view.frame'? – Eddie

+0

這就是所謂的「未定義的行爲」。蘋果可能會選擇實現默認狀態,因爲他們沒有做任何承諾。依靠它是個壞主意。它可能會改變與新版本的Xcode再次。你的例子是正確的。 –