为什么来自 xib 的 VC 视图初始化的框架不是 MainScreen 的大小?
Why frame of VC's view init from xib not the size of MainScreen?
我有 Storyboard 和 XIB VCs。体验一下:
当从 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
// }
}
我的问题是:为什么以及如何从 xib 获得 VC 的视图得到正确的 MainScreen 大小?
当尺寸代码还没有 运行 时,您期望尺寸合适。后
func viewDidLayoutSubviews() 运行,视图将具有正确的大小。在此之前使用视图的大小只是自找麻烦,您依赖的是未定义的行为,这些行为可能会随着新的 iOS 版本而改变。
如何在从 XIB 初始化后强制加载 IBOutlet?
很简单,只需在视图控制器的 init() 方法中访问视图即可。例如询问视图的大小,视图将被加载。
我有 Storyboard 和 XIB VCs。体验一下:
当从 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
// }
}
我的问题是:为什么以及如何从 xib 获得 VC 的视图得到正确的 MainScreen 大小?
当尺寸代码还没有 运行 时,您期望尺寸合适。后 func viewDidLayoutSubviews() 运行,视图将具有正确的大小。在此之前使用视图的大小只是自找麻烦,您依赖的是未定义的行为,这些行为可能会随着新的 iOS 版本而改变。
如何在从 XIB 初始化后强制加载 IBOutlet?
很简单,只需在视图控制器的 init() 方法中访问视图即可。例如询问视图的大小,视图将被加载。