2016-02-25 2 views
1

J'ai un UIStackView imbriqué qui, lorsque j'appuie sur un bouton, est instancié. Pour aller plus en détail, j'ai un UIStackView qui itère à travers un NSMutableArrayList plein de CustomUIStackViews et les ajoute en tant que arrangedSubviews. Lorsque les CustomUIStackViews sont lancés, ils parcourent également leur propre NSMutableArrayList rempli de UIViews et les ajoute en tant que arrangedSubviews.Condition de course UIStackView?

La chose étrange est que, après toutes mes pour les boucles sont exécutées que j'ai un NSLog:

NSLog(@"parentstackview height is %f",_parentStackView.frame.size.height); 

qui retourne un 0 (ce qui ne doit pas, la hauteur doit être 1861 après tout le spectacle stackviews jusqu'à, qu'ils font visiblement dans le simulateur).

Mais si je crée cette méthode:

- (void)testMethod{ 
    NSLog(@"parentstackview height is %f",_parentStackView.frame.size.height); 
} 

et remise en place NSLog d'avant avec ceci:

[self performSelector:@selector(testMethod) withObject:nil afterDelay:1.0]; 

Ensuite, il retourne 1861 exactement comme il se doit, après le délai de 1 seconde. Pourquoi le retard d'une seconde fait-il une différence?

Répondre

3

Une passe de mise en page n'a probablement pas été effectuée dans votre code, mais traitée plus tard dans la boucle d'exécution, ce qui explique les valeurs différentes.

Si vous avez besoin de la taille dans le même code qu'instantiate les vues de pile imbriquées, vous devez appeler layoutIfNeeded() pour mettre immédiatement en forme toutes les sous-vues.

Vous n'auriez pas trouvé ces détails dans la documentation UIStackView, comme cela est documenté dans la superclasse de la vue de la pile UIView class reference sous les présentations de mise en page.