Як зробити власну анімацію “Ефект імпульсу” на кнопці UIB - iOS


89

Я хотів би мати якусь імпульсну анімацію (нескінченний цикл "масштабування") на кнопці UIB, щоб вона негайно привертала увагу користувачів.

Я бачив це посилання Як створити імпульсний ефект за допомогою -webkit-animation - зовнішні дзвінки, але мені було цікаво, чи є якийсь спосіб зробити це лише за допомогою рідного фреймворку?

Відповіді:


198
CABasicAnimation *theAnimation;

theAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
theAnimation.duration=1.0;
theAnimation.repeatCount=HUGE_VALF;
theAnimation.autoreverses=YES;
theAnimation.fromValue=[NSNumber numberWithFloat:1.0];
theAnimation.toValue=[NSNumber numberWithFloat:0.0];
[theLayer addAnimation:theAnimation forKey:@"animateOpacity"]; //myButton.layer instead of

Стрімкий

let pulseAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.opacity))
pulseAnimation.duration = 1
pulseAnimation.fromValue = 0
pulseAnimation.toValue = 1
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
pulseAnimation.autoreverses = true
pulseAnimation.repeatCount = .greatestFiniteMagnitude
view.layer.add(pulseAnimation, forKey: "animateOpacity")

Див. Статтю "Анімація вмісту шару"


1
Дякую за вашу відповідь! Треба сказати, що я трохи застряг. Я взагалі не знайомий з CALayer, і я не впевнений, як пов’язати його зі своїм UIButton. Плюс ваш код виглядає так, ніби він змінює непрозорість, а не масштаб.
Йоганн

8
добре). "Анімація імпульсу" - це термін, який зазвичай застосовується до ефекту мерехтіння - як зазначено в прикладі у цьому посиланні. Тепер я перечитую ваше запитання і розумію, чого ви хочете. Спочатку кожен вигляд має власний шар. Якщо до проекту додано фреймворк QartzCore, просто введіть, myView.layerщоб отримати до нього доступ. Ви можете анімувати шари за допомогою Core Animation. Для трансформації масштабу ви можете використовувати такий підхід: Підтримка ключових шляхів для структурних полів
берилій

7
Фантастично! Використання @ "transform.scale" замість @ "непрозорість" працює як шарм. Дуже дякую!
Йоганн

2
Якщо у вас його ще немає, вам потрібно додати #import <QuartzCore/QuartzCore.h>, щоб отримати всі визначення для CALayers.
progrmr

UGH! Не редагуйте застарілі 3-річні відповіді, якщо ви не оновите фактичну відповідь до правильної сучасної версії. Додавання пробілів не оновлює його. Особливо, щоб не воскресити його через 3 роки.
Фогмайстер

30

Ось швидкий код для нього;)

let pulseAnimation:CABasicAnimation = CABasicAnimation(keyPath: "transform.scale")
pulseAnimation.duration = 1.0
pulseAnimation.toValue = NSNumber(value: 1.0)
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
pulseAnimation.autoreverses = true
pulseAnimation.repeatCount = .greatestFiniteMagnitude
self.view.layer.add(pulseAnimation, forKey: nil)

2
Що з усіма крапками з комою? ;)
Крістіан

@Christian півтонка встановлює тип константи pulseAnimation. Це не потрібно використовувати, але це, як правило, підвищує чіткість коду, коли права частина завдання не дає зрозуміти, який тип він буде призначати.
Скотт Чоу,

@ScottChow Я думаю, ви говорите про товсту кишку. Мій коментар був жартом до оригінальної відповіді, оскільки немає потреби в крапках з комою у Swift. Думаю, це було не так очевидно зараз, коли відповідь було відредаговано багато :)
Крістіан

9

У швидкому коді відсутній a fromValue, мені довелося його додати, щоб він працював.

pulseAnimation.fromValue = NSNumber(float: 0.0)

Також forKeyслід встановити, інакше removeAnimationне працює.

self.view.layer.addAnimation(pulseAnimation, forKey: "layerAnimation")

3
func animationScaleEffect(view:UIView,animationTime:Float)
{
    UIView.animateWithDuration(NSTimeInterval(animationTime), animations: {

        view.transform = CGAffineTransformMakeScale(0.6, 0.6)

        },completion:{completion in
            UIView.animateWithDuration(NSTimeInterval(animationTime), animations: { () -> Void in

                view.transform = CGAffineTransformMakeScale(1, 1)
            })
    })

}


@IBOutlet weak var perform: UIButton!

@IBAction func prefo(sender: AnyObject) {
    self.animationScaleEffect(perform, animationTime: 0.7)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.