Я разрабатываю приложение 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, он работал, частично. Иногда ярлык исчезает. Я искал в Интернете, но я не мог найти ничего связанного с этим. Поэтому мне интересно, где я ошибаюсь.
Если бы кто-нибудь мог ответить мне, это было бы очень признательно.
Благодаря
Спасибо за ваш ответ, я отредактировал мой вопрос. Я допустил ошибку, это не значит, что анимация не запускает, что этикетка исчезает. Я также добавил строку, в которой я сначала изменяю ее размер. Но я действительно не понимаю, почему я должен назвать эту функцию в основном потоке. – Shrolox
ВСЕ изменения в пользовательском интерфейсе должны выполняться на основном потоке. Без исключений. Если вы используете этот код из фона, это является причиной ваших проблем. «Результаты не определены». –
Хорошо спасибо. Я буду работать с этим. – Shrolox