Я запускаю эту анимацию при взаимодействии с пользователем, и иногда анимация может быть запущена снова до завершения текущей анимации. Мне бы хотелось сделать это, чтобы отменить предыдущую анимацию и продолжить ее с новой.UIView animateWithDuration завершение = YES, несмотря на отмену?
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
self.bounds = bounds;
}
completion:^(BOOL finished) {
if (finished) {
// Do some cleanup after animating.
}
}];
Визуально это похоже на работу, но в моем завершение блока я сказал, что он закончил в обоих случаях, что вызывает код очистки запустить преждевременно. Таким образом, первый блок завершения анимации запускается сразу после запуска второго, с завершенным = YES
. Я ожидал, что у него будет готовое значение NO
, а второе (после его завершения) будет иметь YES
.
Есть ли способ узнать, завершена ли анимация или была ли она отменена другим?
Sidenote: Я пытался делать то же анимацию с CABasicAnimation
, а затем я закончу = NO
в первый раз и YES
во второй раз, так что поведение я получаю, кажется, быть специфическими для animateWithDuration
.
Вот GIF, показывающий приведенный выше код в действии с продолжительностью 10 и блок завершения, обновляющий метку. Как вы можете видеть, finished
является YES
каждый раз, когда анимация будет перезапущен с animateWithDuration
вызова:
Спасибо, это помогло мне исправить мои сбои в анимации из-за того, что закончен всегда быть истинным на iOS 9. – malhal
На самом деле лучше всего проверить границы слоя презентации, тогда вы знаете, закончили или нет. – malhal
Это то, что я тоже делал (iOS 9.3, Swift)! Спасибо за помощь. –