2015-11-19 3 views
0

Я разрабатываю приложение iOS, и меня попросили добавить анимацию, чтобы сделать ее более удобной для пользователя. Так что я хочу анимировать значок на моей кнопке, отображающей количество. Когда изменяется количество, вызывается моя функция valueForItemChanged, затем я изменяю значение в ярлыке bimButtonBadge, и я использую анимацию, которая заставляет ее отскок. Но я столкнулся с проблемой: когда я называю .animateWithDuration() от события, вызванного кнопкой, она не работает:Какао Анимация не запускается при вызове кнопкой

@IBAction func valueForItemChanged(sender: AnyObject) { 
    print("value changed"); 
    self.bimButtonBadge.text = String(self.getTotalItemQuantity()) 
    self.bimButtonBadge.transform = CGAffineTransformMakeScale(0.2, 0.2) 
     UIView.animateWithDuration(1.0, 
      delay: 0, 
      usingSpringWithDamping: 0.2, 
      initialSpringVelocity: 4.0, 
      options: UIViewAnimationOptions.AllowUserInteraction, 
      animations: { 
       self.bimButtonBadge.transform = CGAffineTransformIdentity 
      }, completion: nil) 
} 

Так я попытался сделать эту анимацию в viewDidLayoutSubviews(), просто видеть. Это сработало. Я думаю, что viewDidLayoutSubview вызывается из основного потока, так что я попытался это:

@IBAction func valueForItemChanged(sender: AnyObject) { 
    print("value changed"); 
    self.bimButtonBadge.text = String(self.getTotalItemQuantity()) 
    self.bimButtonBadge.transform = CGAffineTransformMakeScale(0.2, 0.2) 
    dispatch_async(dispatch_get_main_queue(), { 
     UIView.animateWithDuration(1.0, 
      delay: 0, 
      usingSpringWithDamping: 0.2, 
      initialSpringVelocity: 4.0, 
      options: UIViewAnimationOptions.AllowUserInteraction, 
      animations: { 
       self.bimButtonBadge.transform = CGAffineTransformIdentity 
      }, completion: nil) 
    }); 
} 

Aaaaaand, он работал, частично. Иногда ярлык исчезает. Я искал в Интернете, но я не мог найти ничего связанного с этим. Поэтому мне интересно, где я ошибаюсь.

Если бы кто-нибудь мог ответить мне, это было бы очень признательно.

Благодаря

ответ

0

анимация (обе версии) устанавливает знак преобразует к личности преобразования, но не показывает какой-либо код, который устанавливает преобразование к чему-либо другому, чем тождественное преобразованию. Анимация оживляет изменение свойства. Если вы ничего не меняете, это не будет анимировать.

Что вы пытаетесь сделать? Вы говорите, что используете анимацию отскока, но что вы имеете в виду? Отскок размера? Положение?

+0

Спасибо за ваш ответ, я отредактировал мой вопрос. Я допустил ошибку, это не значит, что анимация не запускает, что этикетка исчезает. Я также добавил строку, в которой я сначала изменяю ее размер. Но я действительно не понимаю, почему я должен назвать эту функцию в основном потоке. – Shrolox

+0

ВСЕ изменения в пользовательском интерфейсе должны выполняться на основном потоке. Без исключений. Если вы используете этот код из фона, это является причиной ваших проблем. «Результаты не определены». –

+0

Хорошо спасибо. Я буду работать с этим. – Shrolox

0

Проблема решена.

Я решил это делать мое первое преобразование в основном потоке благодаря Duncan C. Мой код теперь:

@IBAction func valueForItemChanged(sender: AnyObject) { 
print("value changed"); 
dispatch_async(dispatch_get_main_queue(), { 
    self.bimButtonBadge.text = String(self.getTotalItemQuantity()) 
    self.bimButtonBadge.transform = CGAffineTransformMakeScale(0.2, 0.2) 
    UIView.animateWithDuration(1.0, 
     delay: 0, 
     usingSpringWithDamping: 0.2, 
     initialSpringVelocity: 4.0, 
     options: UIViewAnimationOptions.AllowUserInteraction, 
     animations: { 
      self.bimButtonBadge.transform = CGAffineTransformIdentity 
     }, completion: nil) 
}); 

}

Смежные вопросы