Używam tej animacji podczas interakcji użytkownika, a czasami animacja może zostać uruchomiona ponownie przed zakończeniem animacji. Chciałbym to anulować poprzednią animację i przejść do nowej.UIView animateWithDuration complete has = TAK pomimo anulowania?
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionBeginFromCurrentState
animations:^{
self.bounds = bounds;
}
completion:^(BOOL finished) {
if (finished) {
// Do some cleanup after animating.
}
}];
Wizualnie, to wydaje się działać, ale w moim bloku zakończenia Powiedziano mi, że zakończone w obu przypadkach, co powoduje uruchomienie kodu porządki przedwcześnie. Tak więc blok ukończenia pierwszej animacji jest uruchamiany natychmiast po rozpoczęciu drugiego, zakończony = YES
. Spodziewałem się, że ma on skończoną wartość NO
, a drugi (po zakończeniu) ma YES
.
Czy istnieje sposób sprawdzenia, czy animacja została ukończona, czy została anulowana przez inną?
Sidenote: Próbowałem robić taką samą animację z CABasicAnimation
a następnie dostać gotowy = NO
po raz pierwszy i YES
po raz drugi, więc zachowanie Dostaję wydaje się być specyficzna dla animateWithDuration
.
Oto GIF pokazujący powyższy kod w akcji o czasie trwania 10 i blok zakończenia aktualizujący etykietę. Jak widać, finished
jest YES
każdym razem animacja zostaje wznowiona z wezwaniem animateWithDuration
:
Dzięki temu pomogło mi naprawić błędy w animacji, ponieważ skończone zawsze jest prawdziwe na iOS 9. – malhal
Właściwie lepszym sposobem jest sprawdzenie granic warstwy prezentacji, aby wiedzieć, czy skończyła się, czy nie. – malhal
Tak też zrobiłem (iOS 9.3, Swift)! Dzięki za pomoc. –