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.
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.
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".
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.