J'ai deux Storyboard et XIB VCs. Expérimentez simplement ceci:Pourquoi le cadre de la vue de VC init de xib n'est pas la taille de MainScreen?
Lors de l'initialisation de VC à partir de XIB, la taille de la vue est {600, 600}, mais si elle est initialisée à partir de Storyboard, la taille de la vue est identique à UIScreen.main().bounds
.
Pour creuser plus profondément, il semble que lors de l'initialisation à partir de storyboard, la vue a la propriété view.window != nil
, tandis que si elle est initialisée à partir de XIB, son window == nil
. Peut-être que c'est la raison de la taille étrange.
Ma question est: Pourquoi, et comment puis-je obtenir la vue de VC de xib obtenu la taille correcte de MainScreen?
J'ai essayé de définir manuellement comme ceci: vc.view.frame = UIScreen.main.bounds
, et cela fonctionne. Cependant, cela va également déclencher viewDidLoad
où je fais une configuration pour mon contenu, et l'IBOutlet à ce moment-là n'a pas été chargé et toutes les configurations sont erronées! Donc, une question bonus est soulevée: Comment forcer le chargement de l'IBOutlet après l'initialisation de XIB?
Quelques exemples de code qui provoquent cette question:
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
// }
}
Vous avez probablement défini votre fichier xib pour utiliser des classes de taille. Les classes de taille sont 600x600 même à partir de storyboard –
@ YunusErenGüzel bien oui, mon application est supposée prendre en charge plusieurs appareils, alors comment devrions-nous faire sans l'aide de AutoLayout et SizeClass? – Eddie
Vous ne pouvez pas le changer. C'est ainsi qu'il devrait supposer fonctionner. Pourquoi est-ce un problème pour vous? –