122 votes

iOS : Comment s'animer en fonction de la nouvelle contrainte d'autolayout (hauteur) ?

Je n'ai jamais travaillé avec autolayout contraintes avant. J'ai une nouvelle petite application sur laquelle je travaille et j'ai remarqué que les vues du NIB sont par défaut en autolayout. Je me suis donc dit que j'allais profiter de l'occasion pour travailler sur les contraintes. avec et essayer de comprendre où Apple veut en venir.

Premier défi :

Je dois redimensionner un MKMapView et j'aimerais l'animer vers la nouvelle position. Si je fais cela de la façon dont j'ai l'habitude de le faire :

[UIView animateWithDuration:1.2f
     animations:^{
         CGRect theFrame = worldView.frame;
         CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
         worldView.frame = newFrame;
}];

...alors le MKMapView reviendra à sa hauteur initiale dès qu'une vue sœur sera mise à jour (dans mon cas, le titre d'un UISegmentedControl est mis à jour). [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0] ).

Donc, ce que je pensez à Je veux modifier les contraintes de la MKMapView, qui ne sont plus égales à la hauteur de la vue parente, mais relatives au haut de l'UISegmentedControl qu'elle utilise. était couvrant : V:[MKMapView]-(16)-[UISegmentedControl]

Ce que je veux, c'est que la hauteur du MKMapView soit réduite afin que certains contrôles sous la vue de la carte soient révélés. Pour ce faire, je pensez à J'ai besoin de changer la contrainte d'une vue fixe en taille réelle à une vue où le bas est contraint au haut d'un UISegmentedControl... et j'aimerais que cela s'anime lorsque la vue se réduit à la nouvelle taille.

Comment s'y prendre ?

Editer - cette animation est no animer bien que le bas de la vue se déplace vers le haut 170 instantanément :

    [UIView animateWithDuration:1.2f
         animations:^{
             self.nibMapViewConstraint.constant = -170;

    }];

et le nibMapViewConstraint est câblé en IB à la contrainte d'espace vertical inférieure.

177voto

Ed McManus Points 3024

Après avoir mis à jour votre contrainte :

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

Remplacer self.view avec une référence à la vue qui la contient.

86voto

DevC Points 430

Cela fonctionne pour moi. Cliquez sur la contrainte de mise en page automatique que vous souhaitez ajuster (dans le constructeur d'interface, par exemple la contrainte supérieure). Ensuite, faites-en un IBOutlet ;

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;

Animer vers le haut ;

    self.topConstraint.constant = -100;    
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded]; 
    }];

Animer pour revenir à l'endroit initial

    self.topConstraint.constant = 0;    
    [self.viewToAnimate setNeedsUpdateConstraints];  
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded];
    }];

11voto

Glenn Points 81

Il existe un très bon tutoriel d'Apple lui-même qui explique comment utiliser l'animation avec autolayout. Suivez ce qui suit lien et trouvez ensuite la vidéo intitulée "Auto layout by example" (mise en page automatique par exemple). Elle donne des informations intéressantes sur la mise en page automatique et la dernière partie porte sur l'utilisation de l'animation.

3voto

Jens Schwarzer Points 591

J'ai fait cette petite démo disponible . Il montre comment les contraintes de mise en page automatique peuvent être modifiées et animées dans un exemple très simple. Il suffit de jeter un coup d'œil à la DemoViewController.m .

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