为什么来自xib的VC视图init的框架不是MainScreen的大小?

时间:2017-08-15 12:14:28

标签: ios uiviewcontroller storyboard frame xib

我有Storyboard和XIB VC。只需体验一下:

从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
    // }
}

1 个答案:

答案 0 :(得分:1)

我的问题是:为什么,以及如何从xib获取VC的视图得到正确的MainScreen大小?

当调整代码尚未运行时,您期望正确的尺寸。后     func viewDidLayoutSubviews()运行,视图将具有正确的大小。在此之前使用视图的大小只是要求麻烦,并且您依赖于可以随新iOS版本更改的未定义行为。

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

很容易,只需在视图控制器的init()方法中访问视图。例如,询问视图的大小,将加载视图。

相关问题