46 votes

iOS modifie les contraintes de mise en page automatique lorsque l'appareil pivote

Je veux modifier les contraintes de mise en forme lorsque l'appareil tourne. Mon UIViewController est composé de 2 UIViews, dans le paysage, elles sont alignés horizontalement, et dans le portrait qu'ils sont alignés verticalement.

Il fonctionne, en fait, en willAnimateRotationToInterfaceOrientation,- je supprimer le désiré des contraintes et de les remplacer par d'autres pour avoir le droit de mise en page...

Mais il y a des problèmes, lors de la rotation automatique de la mise en page commence à briser les contraintes avant d' willAnimateRotationToInterfaceOrientation est appelé, alors, où en sommes-nous destinés à remplacer nos contraintes lorsque le dispositif de réorientation se produit ?

Un autre problème est la performance, après quelques rotations, le système ne se cassent pas plus de contraintes, mais j'ai une énorme chute des performances, surtout en mode portrait...

52voto

rob mayoff Points 124153

En willRotateToInterfaceOrientation:duration:, envoyez - setNeedsUpdateConstraints à tout point de vue que les besoins de ses contraintes modifié.

Vous pouvez également faire une UIView sous-classe. Dans votre sous-classe, vous inscrire pour recevoir des UIApplicationWillChangeStatusBarOrientationNotification. Lorsque vous recevez la notification, envoyez-vous setNeedsUpdateConstraints.

Ceci définit l' needsUpdateConstraints drapeau sur la vue. Avant que le système effectue la mise en page (par l'envoi d' layoutSubviews des messages), il envoie un updateConstraints message à tout point de vue qui a l' needsUpdateConstraints indicateur. C'est là que vous devez modifier vos contraintes. Faire un UIView sous-classe et de remplacer updateConstraints de la mise à jour de vos contraintes.

13voto

Flar49 Points 248

Il y a une très bonne explication de l'auto-mise en page et les rotations en Matthijs Hollemans post. Vous pouvez le trouver ici: http://www.raywenderlich.com/20881/beginning-auto-layout-part-1-of-2

Généralement, vous avez besoin d'environ 4 contraintes de positionnement de votre point de vue. Si mes points de vue ont taille constante, je préfère à la broche de la hauteur et la largeur. Après cela, vous pouvez utiliser des Haut et des contraintes d'espace pour faire ce que vous voulez. Par exemple, vous pouvez définir IBOutlets de la direction et de haut contraintes d'espace pour vos points de vue:

@interface ViewController : UIViewController {
    IBOutlet NSLayoutConstraint *_leadingSpaceConstraint;
    IBOutlet NSLayoutConstraint *_topSpaceConstraint;
}

Ensuite, le contrôle-glissez-le de la prise de votre contrainte. Maintenant, vous pouvez directement changer votre point de vue contrainte de code:

_leadingSpaceConstraint.constant = NEW_CONSTRAINT_VALUE;

Pour valider vos modifications, vous devez appeler:

[self.view layoutIfNeeded];

Et si vous voulez le faire d'animation:

[UIView animateWithDuration:0.25
                 animations:^{
                     [self.view layoutIfNeeded];
                 }];

Je pense qu'il va travailler dans willAnimateRotationToInterfaceOrientation, parce que vous n'avez pas besoin de casser toutes les contraintes avec cette approche.

Quelques exemple: Vous avez deux carrés de vue en mode portrait, l'un sous l'autre. Définir leur "espace à gauche pour superview" contraintes à 20, par exemple. Ensuite, réglez "en haut de l'espace de superview contrainte" à 20 pour la première vue, et à 120 € pour la seconde. Il sera de notre programme d'installation par défaut.

Puis, après la rotation, vous devez recalculer vos contraintes. Maintenant définir à la fois de haut contraintes à 20, et les principales contraintes à 20 et 120 respectivement. Puis de valider les modifications avec layoutIfNeeded.

J'espère que ça aidera.

2voto

MuhammadBassio Points 1023

remplacez -(void) viewWillLayoutSubviews dans votre UIViewController pour mettre à jour vos contraintes comme ci-dessous:

 -(void) viewWillLayoutSubviews {
     switch(self.interfaceorientation)
     {
          case UIInterfaceOrientationLandscapeLeft:

              break;
          case UIInterfaceOrientationLandscapeRight:

              break;

          case UIDeviceOrientationPortrait:

              break;

          case UIDeviceOrientationPortraitUpsideDown:

              break;

     }
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X