为什么从xib初始化VC视图的框架不是MainScreen的大小?

问题描述:

我有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

你不能改变它。这是它应该如何工作的。为什么这是你的问题? –

我的问题是:为什么,以及如何从厦门国际银行获得VC的观点得到了MainScreen的正确尺寸是多少?

当尺寸代码尚未运行时,您期待正确的尺寸。在 func viewDidLayoutSubviews()运行后,视图将具有正确的大小。在此之前使用视图的大小只是要求麻烦,而您依赖的是未定义的行为,这些行为可能会随着新的iOS版本发生变化。

如何从XIB初始化后强制加载IBOutlet?

轻松地访问视图控制器的init()方法中的视图。例如请求视图的大小,视图将被加载。

+0

但为什么当init vc从storyboard获得正确大小的视图?再加上,你可以在第二个答案中更具体(请问视图的大小)?是不是让'rect = vc.view.frame'? – Eddie

+0

这就是所谓的“未定义的行为”。苹果可能会选择实现默认状态,因为他们没有做任何承诺。依靠它是个坏主意。它可能会改变与新版本的Xcode再次。你的例子是正确的。 –