Como faço para esperar até uma animação em uma classe diferente é concluído antes de continuar?
-
27-10-2019 - |
Pergunta
Eu tenho o código simples:
[otherClass doMethodOneWhichHasAnimation];
e que a animação dura 0,8 segundos. Seguido pelo código que empurra um viewcontroller:
SchemeView *schemeView = [[SchemeView alloc] init];
[self.navigationController pushViewController:schemeView animated:YES];
[schemeView release];
O problema é, ele empurra o viewcontroller sem esperar, e eu gostaria que esperar. atraso fazendo apenas atrasa a coisa toda, incluindo a primeira animação seja iniciado.
Como posso obtê-lo para esperar os 0,8 segundos antes de executar o segundo trecho de código?
Solução
Você pode empurrar após a animação é feito
[UIView animateWithDuration:0.8
animations:^{
// Animation
}
completion:^(BOOL finished){
// PushView
}];
para ou [self performSelector:@selector(metohodToPushView) withObject:nil afterDelay:0.8];
Outras dicas
Você pode usar CATransaction
para executar um bloco conclusão depois de qualquer animação, sem alterar o código fonte do método que cria a animação. Você precisará com o quadro QuartzCore
e você 'll necessidade de #import <QuartzCore/QuartzCore.h>
. Em seguida, você pode fazer isso:
[CATransaction begin]; {
[CATransaction setCompletionBlock:^{
// This block runs after any animations created before the call to
// [CATransaction commit] below. Specifically, if
// doMethodOneWhichHasAnimation starts any animations, this block
// will not run until those animations are finished.
SchemeView *schemeView = [[SchemeView alloc] init];
[self.navigationController pushViewController:schemeView animated:YES];
[schemeView release];
}];
// You don't need to modify `doMethodOneWhichHasAnimation`. Its animations are
// automatically part of the current transaction.
[otherClass doMethodOneWhichHasAnimation];
} [CATransaction commit];
Eu tenho contornar este problema, fazendo uma nova classe para executar animações.
Esta classe contagem de quanto tempo como passado sincronizado com o início da animação.
Você alimenta no tempo para a animação para a classe e tanto o bloco de animação eo contador de classe leva esse número em.
Quando o contador chegou ao fim você sabe que a animação também foi concluída.
... Tudo sem aleatórios Bibliotecas complicado.
simplesmente chamar um método com o tempo de atraso intervalo
como -
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1.00];