2017-08-15 1 views
-1

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 
    // } 
} 
+0

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 –

+0

@ 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

+0

Vous ne pouvez pas le changer. C'est ainsi qu'il devrait supposer fonctionner. Pourquoi est-ce un problème pour vous? –

Répondre

0

Ma question est: Pourquoi, et comment puis-je obtenir le point de vue de VC de la taille xib obtenu correcte de MainScreen?

Vous attendez la bonne taille lorsque le code de dimensionnement n'a pas encore fonctionné. Après func viewDidLayoutSubviews() a été exécuté, l'affichage aura la taille correcte. Utiliser la taille de la vue avant cela ne fait que vous poser des problèmes et vous comptez sur un comportement indéfini qui peut changer avec la nouvelle version d'iOS.

Comment forcer le chargement de l'IBOutlet après son initialisation à partir de XIB?

Facilement, accédez simplement à la vue dans la méthode init() de votre contrôleur de vue. Par exemple demander la taille de la vue, la vue sera chargée.

+0

mais pourquoi quand la vue d'init vc du storyboard a la bonne taille?De plus, pouvez-vous être plus précis dans votre deuxième réponse (demandez la taille de la vue)? n'est-ce pas 'let rect = vc.view.frame'? – Eddie

+0

Ceci est ce que l'on appelle un "comportement indéfini". Apple peut choisir d'implémenter l'état par défaut comme bon lui semble, car il n'a fait aucune promesse. C'est une mauvaise idée de s'en prévaloir. il pourrait encore changer avec la nouvelle version de Xcode. Votre exemple est correct. –