web-dev-qa-db-fra.com

Création d'une animation pour agrandir et réduire une UIView

Je veux créer une animation qui redimensionnera un UIView et son contenu par un facteur. Fondamentalement, je veux faire une animation qui élargit d'abord la vue, puis la ramène à sa taille d'origine.

Quelle est la meilleure façon de procéder? J'ai essayé CALayer.contentScale mais cela n'a rien fait du tout.

25
Flying_Banana

Vous pouvez imbriquer des blocs d'animation ensemble comme ceci:

Objectif c:

[UIView animateWithDuration:1
                 animations:^{
                     yourView.transform = CGAffineTransformMakeScale(1.5, 1.5);
                 }
                 completion:^(BOOL finished) {
                     [UIView animateWithDuration:1
                                      animations:^{
                                          yourView.transform = CGAffineTransformIdentity;

                                      }];
                 }];

Swift 2:

UIView.animateWithDuration(1, animations: { () -> Void in
    yourView.transform = CGAffineTransformMakeScale(1.5, 1.5)
    }) { (finished: Bool) -> Void in
        UIView.animateWithDuration(1, animations: { () -> Void in
            yourView.transform = CGAffineTransformIdentity
        })}

Swift 3 & 4:

UIView.animate(withDuration: 1, animations: {
    yourView.transform = CGAffineTransform(scaleX: 1.5, y: 1.5)
}) { (finished) in
    UIView.animate(withDuration: 1, animations: { 
        yourView.transform = CGAffineTransform.identity
    })
}

et en remplaçant les valeurs d'échelle et les durées par les vôtres.

51
JJC

Voici une approche plus petite qui boucle également:

[UIView animateWithDuration:1
                      delay:0
                    options:UIViewKeyframeAnimationOptionAutoreverse | UIViewKeyframeAnimationOptionRepeat
                 animations:^{
                     yourView.transform = CGAffineTransformMakeScale(1.5, 1.5);
                 }
                 completion:nil];

L'option UIViewKeyframeAnimationOptionRepeat est ce qui la fait boucler, si vous ne voulez pas qu'elle continue à "respirer". Le bloc d'animation agit comme "inspirez" et l'option UIViewKeyframeAnimationOptionAutoreverse joue automatiquement l'animation "expirez".

10
Ian Spence

Extension Swift 5 UIView:

extension UIView {
    func Pulse(withIntensity intensity: CGFloat, withDuration duration: Double, loop: Bool) {
        UIView.animate(withDuration: duration, delay: 0, options: [.repeat, .autoreverse], animations: {
            loop ? nil : UIView.setAnimationRepeatCount(1)
            self.transform = CGAffineTransform(scaleX: intensity, y: intensity)
        }) { (true) in
            self.transform = CGAffineTransform.identity
        }
    }
}

Et puis utilisez ce qui suit:

yourView.Pulse(withIntensity: 1.2, withDuration: 0.5, loop: true)

Assurez-vous simplement de remplacer yourView par votre propre vue.

1
Stephen Collins