代码之家  ›  专栏  ›  技术社区  ›  Eddie

为什么VC的view init from xib的框架不是主屏幕的大小?

  •  1
  • Eddie  · 技术社区  · 7 年前

    我有故事板和XIB VCs。只要体验一下:

    UIScreen.main().bounds .

    更深入地说,当从情节提要初始化时,视图似乎获得了属性 view.window != nil window == nil . 也许这就是奇怪尺寸的原因。

    我试图手动设置如下: vc.view.frame = UIScreen.main.bounds ,并且有效。然而,这也会触发 viewDidLoad 在那里,我对我的内容进行了一些设置,而当时的IBOutlet还没有加载,每个设置都是错误的!

    因此,提出了一个额外的问题:如何在从XIB初始化后强制加载IBMoutlet?

    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 回复  |  直到 7 年前
        1
  •  1
  •   Juraj Antas    7 年前

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

    func viewDidLayoutSubviews()已运行,视图大小将正确。在此之前使用视图大小只是自寻烦恼,您依赖的是未定义的行为,这些行为可能会随着新的iOS版本而改变。

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