2016-06-27 4 views
1

J'ai un problème de compréhension ... J'ai créé deux vues similaires (même origine et même taille) et vue en coupe, Bien que j'ai créé ces vues - un dans viewDidLoad et l'autre dans viewDidAppear - quand je mets un point de départ similaire dans l'origine x et y de chaque vue qui se réfèrent à la section i, ces vues sont dans une position différente. Quelqu'un peut-il m'expliquer quelle est la raison pour laquelle ces opinions ne sont pas dans la même position?Swift - Affichage d'une position différente sur viewDidLoad et viewDidAppear

import UIKit 

class ViewController: UIViewController { 

    @IBOutlet var sec: UIView! 

    override func viewDidLoad() { 
     let shape = UIView(frame: CGRect(x: sec.frame.width/2, y: sec.frame.height/2, width: 100, height: 100)); 
     shape.backgroundColor = UIColor.redColor(); 
     view.addSubview(shape); 
    } 

    override func viewDidAppear(animated: Bool) {  
     let shape2 = UIView(frame: CGRect(x: sec.frame.width/2, y: sec.frame.height/2, width: 100, height: 100)); 
     shape2.backgroundColor = UIColor.greenColor(); 
     view.addSubview(shape2); 
    } 
} 

Répondre

4

La raison est parce que la méthode viewDidAppear appelé après le moteur autolayout terminé, il fonctionne, viewDidLoad - avant. Avant l'autolayout, les cadres de toutes les vues à l'écran ne sont pas corrects dans la plupart des cas. Vous pouvez utiliser la méthode viewDidLayoutSubviews comme point le plus proche lorsque l'autolayout est terminé et que les images sont correctes. Notez que cette méthode peut être appelée plusieurs fois.

Mise à jour. Autolayout utilisé par défaut pour view dans UIViewController, ainsi que pour les vues dans le storyboard; vous avez ajouté des vues personnalisées dans le code, qui n'utilisent pas autolayout. Vous devez mélanger soigneusement les vues autolayout et les vues initialisées par image.

+0

@ r.pul il n'y a pas d'erreurs de compilation devrait être, c'est à peu près comment tout cela fonctionne. Autolayout est une nouvelle fonctionnalité (seulement depuis iOS 6 ou 7). Ainsi, avant l'introduction du moteur de mise en page automatique, tous les systèmes de coordonnées étaient clairs et droits, comme vous l'attendiez dans votre question. Vous ne gériez toutes les coordonnées que par les propriétés du cadre (en configurant parfois des masques autorésisants). Le temps passe, et de nouveaux appareils avec une nouvelle résolution d'écran présentée, il était donc de plus en plus difficile de gérer (redimensionner) toutes les images à la main. C'est pourquoi Apple a introduit le moteur autolayout, basé, bien sûr, sur le système de cadre existant –

+0

Merci beaucoup pour votre commentaire rapide et utile, je supposais que c'est le problème ... encore c'est un peu étrange pour moi ... Pourquoi le le compilateur ne montre aucune erreur? Qu'est-il arrivé derrière la scène .. est-ce qu'il devine à propos de la taille de ces cadres de vues utilisés autolayout que je leur renvoie sur viewDidLoad? –

+1

merci encore !! maintenant il est plus clair pour moi –