J'ai une UIView personnalisée qui a un cadre dédié, défini manuellement pour l'orientation portrait et paysage car les masques autoresizing ne fonctionnent tout simplement pas dans mon cas.
J'ai mis ce cadre dans:
- (void)viewWillAppear:(BOOL)animated
Et cela fonctionne comme prévu.
Mon problème est maintenant que mon UIView a en outre des sous-vues qui ont également une position dédiée pour le portrait/paysage.
Je positionne ces sous-vues dans:
- (void)layoutSubviews
Si je laisse maintenant mon viewController dans par exemple orientation portrait, pivoter en paysage sur un autre viewController puis revenir à ce viewController, je vois que ma vue a été redimensionnée correctement, mais les sous-vues de ma vue, qui sont positionnées dans la mise en page Les sous-vues ne sont pas encore repositionnées mais sont redimensionnées de façon animée après que la vue est déjà apparue.
Je ne fais rien dans viewDidAppear et j'ai déjà essayé d'appeler
- (void)layoutIfNeeded
Aussi bien que:
- (void)setNeedsLayout
Dans viewWillAppear, mais cela ne semble rien changer.
Des idées sur ce que je fais mal?
Merci.
Eu un problème similaire aujourd'hui. Je l'ai résolu en appelant d'abord
-setNeedsLayout
: Définissez le drapeau dont la vue doit disposer, puis appelez-layoutIfNeeded
: Vérifiez l'indicateur immédiatement et - comme il a été défini manuellement auparavant - comme résultat layoutSubviews est appelé.Je ne sais pas si c'est la meilleure façon, mais ça marche;)
Je suggère de définir le cadre initial dans viewDidLoad puis de changer le cadre de vue pour les changements d'orientation dans
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
Vous n'avez pas besoin d'animations explicites dans layoutSubviews (vous ne savez pas si vous en aviez, mais cela ressemblait à ça) car tout changement de cadre sera synchronisé avec l'animation de rotation.
En dehors de l'écran, l'orientation doit toujours être pivotée, de sorte que vos vues doivent être correctement positionnées lors de la transition vers l'écran.
Je recommande également de regarder la Session 123 de la WWDC 2010 "Building UI Animation Driven" qui couvre ce genre de choses beaucoup plus en détail.
À Swift 3 @iOS 10.1
override func viewWillAppear(animated: Bool){
super.viewWillAppear(animated)
view.setNeedsLayout()
}
fonctionne parfaitement