2016-01-11 2 views
6

Я создал анимацию сердечного ритма для UIButton. Однако нет возможности остановить эту анимацию, поскольку это бесконечный цикл кода. После обработки многочисленными блоками кода анимации UIView мне не удалось получить UIViewAnimationOptions.Repeat, чтобы создать то, что мне нужно. Если бы я мог сделать это, я мог бы просто button.layer.removeAllAnimations() удалить анимацию. Каков способ написать это, что позволяет удалить анимацию? Я думаю, что возможно таймер, но это может быть довольно грязно с несколькими анимациями.UIButton Heartbeat Animation

func heartBeatAnimation(button: UIButton) { 

    button.userInteractionEnabled = true 
    button.enabled = true 

    func animation1() { 

     UIView.animateWithDuration(0.5, delay: 0.0, options: [], animations: {() -> Void in 

      button.transform = CGAffineTransformMakeScale(2.0, 2.0) 
      button.transform = CGAffineTransformIdentity 

     }, completion: nil) 

     UIView.animateWithDuration(0.5, delay: 0.5, options: [], animations: {() -> Void in 

      button.transform = CGAffineTransformMakeScale(2.0, 2.0) 
      button.transform = CGAffineTransformIdentity 

      }) { (Bool) -> Void in 

       delay(2.0, closure: {() ->() in 

        animation2() 

       })  
     } 
    } 

    func animation2() { 

     UIView.animateWithDuration(0.5, delay: 0.0, options: [], animations: {() -> Void in 

      button.transform = CGAffineTransformMakeScale(2.0, 2.0) 
      button.transform = CGAffineTransformIdentity 

      }, completion: nil) 

     UIView.animateWithDuration(0.5, delay: 0.5, options: [], animations: {() -> Void in 

      button.transform = CGAffineTransformMakeScale(2.0, 2.0) 
      button.transform = CGAffineTransformIdentity 

      }) { (Bool) -> Void in 

       delay(2.0, closure: {() ->() in 

        animation1() 

       }) 
     } 
    } 

    animation1() 

} 

ответ

18

Это прекрасно работает. Затухание и пружину нужно немного подкорректировать, но это решает проблему. removeAllAnimations() очищает анимацию и возвращает кнопку в нормальное состояние.

button.userInteractionEnabled = true 
button.enabled = true 

let pulse1 = CASpringAnimation(keyPath: "transform.scale") 
pulse1.duration = 0.6 
pulse1.fromValue = 1.0 
pulse1.toValue = 1.12 
pulse1.autoreverses = true 
pulse1.repeatCount = 1 
pulse1.initialVelocity = 0.5 
pulse1.damping = 0.8 

let animationGroup = CAAnimationGroup() 
animationGroup.duration = 2.7 
animationGroup.repeatCount = 1000 
animationGroup.animations = [pulse1] 

button.layer.addAnimation(animationGroup, forKey: "pulse") 

Это сообщение было очень полезно: CAKeyframeAnimation delay before repeating

+0

Это идеальное спасибо :) – RichAppz

0

На ваш первоначальный вопрос вы упомянули, что вы хотите анимацию, чтобы остановить по команде. Я предполагаю, что вы хотите, чтобы он тоже начал командование. Это решение будет делать и то, и другое довольно просто.

func cutAnim(){ 
    for view in animating { 
     ///I use a UIView because I wanted the container of my button to be animated. UIButton will work just fine too. 
     (view.value as? UIView)?.layer.removeAllAnimations() 
    } 
} 

func pulse(button: UIButton, name: String){ 
    ///Here I capture that container 
    let container = button.superview?.superview 
    ///Add to Dictionary 
    animating[name] = container 
    cutAnim() 
    UIView.animate(withDuration: 1, delay: 0.0, options:[UIViewAnimationOptions.repeat, UIViewAnimationOptions.autoreverse, .allowUserInteraction], animations: { 
     container?.transform = CGAffineTransform(scaleX: 1.15, y: 1.15) 
     ///if you stop the animation half way it completes anyways so I want the container to go back to its original size 
     container?.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) 
    }, completion: nil) 
} 

Вызов cutAnim() где угодно, чтобы остановить анимацию, если хотите, потайной таймер.

Для запуска анимации использовать обычную кнопку действие

@IBAction func buttonWasTappedAction(_ sender: Any) { 
    pulse(button: sender as! UIButton, name: "nameForDictionary") 
    } 

Надеется, что это помогает.