web-dev-qa-db-fra.com

Comment forcer la mise en page

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.

50
myell0w

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;)

92
blacky85

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.

5
Chris Miles

À Swift 3 @iOS 10.1

override func viewWillAppear(animated: Bool){

    super.viewWillAppear(animated)
    view.setNeedsLayout()
}

fonctionne parfaitement

4