31

Вопрос по iphone, core-animation, ios, core-graphics – CAKeyframeAnimation задержка перед повторением

у меня естьCAKeyframeAnimation анимация, которую я хотел бы повторить навсегда, используяrepeatCount = HUGE_VALF, Анимация »Продолжительность составляет 2 секунды, но я бы хотел сделать паузу в 3 секунды перед каждым циклом.

Единственные 2 способа, которыми я могу думать, это:

  1. Сделайте всю анимацию длиться 5 секунд и добавьте дополнительные значения времени и ключа, чтобы я получил паузуищу в течение последних 3-х анимаций 5-х. Это выглядит как-то странно.

  2. Пусть анимация повторяется только один раз, а затем добавьте что-то вродеperformSelector:afterDelay:2 снова запустить анимацию, и так далее, и так далее. Это тоже грязно. Также будет означать, что мне нужно позвонитьaddAnimation: каждые 5 секунд, которые яЯ не уверен, что является оптимальным с точки зрения производительности.

Есть ли другой вариант, который я мог бы упустить? Один из этих двух методов лучше, чем другой?

2ответа

115

Сбрасывая анимацию AppleMKUserLocationViewЯ смог увидеть, как они это делают. Оказывается, это то, чтоCAAnimationGroup для. Инкапсулируя 2-секундную анимацию в 5-секундную анимационную группу, выв итоге получится анимация 2 секунды с последующей задержкой 3 секунды:

CAAnimationGroup *animationGroup = [CAAnimationGroup animation];
animationGroup.duration = 5;
animationGroup.repeatCount = INFINITY;

CAMediaTimingFunction *easeOut = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];

CABasicAnimation *pulseAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"];
pulseAnimation.fromValue = @0.0;
pulseAnimation.toValue = @1.0;
pulseAnimation.duration = 2;
pulseAnimation.timingFunction = easeOut;

animationGroup.animations = @[pulseAnimation];

[ringImageView.layer addAnimation:animationGroup forKey:@"pulse"];
7

samvermette»ответ в Swift 3:

let animationGroup = CAAnimationGroup()
animationGroup.duration = 5;
animationGroup.repeatCount = .infinity

let easeOut = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)

let pulseAnimation = CABasicAnimation(keyPath: "transform.scale.xy")
pulseAnimation.fromValue = 0
pulseAnimation.toValue = 1.0
pulseAnimation.duration = 2
pulseAnimation.timingFunction = easeOut

animationGroup.animations = [pulseAnimation]

ringImageView.layer.add(animationGroup, forKey: "pulse")

RelatedQuestions