2017-02-07 3 views
0

У меня есть UIButton в моем приложении с изображением.анимация UIButton на потоке

  • Я хочу, чтобы иметь возможность вызвать функцию, которая вспыхивает на эту кнопку несколько раз (скажем, 5 раз)

  • Я также хочу, чтобы быть в состоянии остановить это мигание во время его работы

Ниже важная часть кода:

var flashesRemaining: Int = 5; 
var isFlashing: Bool = false 

@IBOutlet weak var btnMM: UIButton! 

// Flash the button 
@IBAction func flashMemoryButton(sender: AnyObject) { 
    print(self.flashesRemaining) 
    if self.flashesRemaining == 0 { 
     return 
    } 
    if !isFlashing { 
     self.btnMM.alpha = 1.0 
     UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseInOut, .repeat, .autoreverse, .allowUserInteraction], animations: {() -> Void in 
      self.btnMM.alpha = 0.0100000003 
     }, completion: {(finished: Bool) -> Void in }) 

     isFlashing = true 
    } 
    else { 
     UIView.animate(withDuration: 0.1, delay: 0.0, options: [.curveEaseInOut, .beginFromCurrentState], animations: {() -> Void in 
      self.btnMM.alpha = 1.0 
     }, completion: {(finished: Bool) -> Void in }) 
    } 
    self.flashesRemaining = self.flashesRemaining - 1 
} 

Так что я хочу, чтобы иметь возможность для вызова функции выше, как это, чтобы начать мигать:

self.flashesRemaining = 5 
self.flashMemoryButton(sender: self.btnMM) 

, а затем, если я хочу, чтобы отключить мигание, я должен просто позвонить:

self.flashesRemaining = 0 

Однако приведенный выше код не работает вообще , После того, как я называю

self.flashMemoryButton(sender: self.btnMM) 

я получаю распечатку , а затем кнопку продолжает мигать навсегда. Что мне здесь не хватает?

Кстати, магическое число 0.0100 ... 3 является минимально допустимой альфа для UIButton, поддерживая интерактивность пользователя.

ответ

1

Вот рабочий код:

func flashMemoryButton() { 
    print(self.flashesRemaining) 
    if self.flashesRemaining == 0 { 
     btnMM.alpha = 1 
     return 
    } 
    if !isFlashing { 
     self.btnMM.alpha = 1.0 
     UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseInOut, .allowUserInteraction], animations: {() -> Void in 
      self.btnMM.alpha = 0.0100000003 
     }, completion: {(finished: Bool) -> Void in 
      if finished { 
       self.flashMemoryButton() 
       self.flashesRemaining = self.flashesRemaining - 1 
      } 
     }) 

     isFlashing = true 
    } 
    else { 
     UIView.animate(withDuration: 0.1, delay: 0.0, options: [.curveEaseInOut, .beginFromCurrentState], animations: {() -> Void in 
      self.btnMM.alpha = 1.0 
     }, completion: {(finished: Bool) -> Void in 
      if finished { 
       self.flashMemoryButton() 

      } 
     }) 
     isFlashing = false 
    } 
} 

Вот изменения, которые я сделал:

Во-первых, я удалил .repeat и .autoreverse. Это связано с тем, что вместо повторяющейся анимации мы хотим, чтобы метод flashMemoryButton вызывался несколько раз.

Далее я добавил isFlashing = false в филиале else. Это так, что когда isFlashing истинно, кнопка исчезает в следующий раз, когда вызывается метод, а когда isFlashing ложно, кнопка исчезает. Вы можете думать о isFlashing как о переключении.

Когда анимация fade in/out заканчивается, я звонил flashMemoryButton(), потому что когда анимация заканчивается, вы хотите сделать еще одну анимацию, не так ли?

В обработчике завершения анимации выцветания я уменьшился flashesRemaining. Здесь вы хотите уменьшить его, а не за пределами оператора if. Если вы выберете его снаружи, он будет мигать в половину раз, когда вы сказали это.

1

Вы можете использовать UIView.setAnimationRepeatCount; поэтому вам больше не нужно flashesRemaining. Вы также должны повторно установить isFlashing -flag в обработчике завершения. Здесь мой модифицированный код:

var isFlashing: Bool = false 

@IBOutlet weak var btnMM: UIButton! 

@IBAction func flashMemoryButton(sender: AnyObject) { 
    if !isFlashing { 
     self.btnMM.alpha = 1.0 
     UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseInOut, .repeat, .autoreverse, .allowUserInteraction], animations: {() -> Void in 
      UIView.setAnimationRepeatCount(5) 
      self.btnMM.alpha = 0.0100000003 
     }, completion: {(finished: Bool) -> Void in 
      UIView.animate(withDuration: 0.1, delay: 0.0, options: [.curveEaseInOut, .beginFromCurrentState], animations: {() -> Void in 
       self.btnMM.alpha = 1.0 
      }, completion: {(finished: Bool) -> Void in self.isFlashing = false}) 
     }) 

     isFlashing = true 
    } 
    else { 
     UIView.animate(withDuration: 0.1, delay: 0.0, options: [.curveEaseInOut, .beginFromCurrentState], animations: {() -> Void in 
      self.btnMM.alpha = 1.0 
     }, completion: {(finished: Bool) -> Void in self.isFlashing = false}) 
    } 
}