Во время перехода все представления находятся в промежуточном представлении (типа UITransitionView
). Так что просто выберите какой-либо выход, о котором вы знаете, что это прямое подпредставление главного окна, и проверьте, !([[outlet superview] isKindOfClass:[UIWindow class]])
и отложите ли выполнение, используя performSelector:withObject:withDelay:
, передайте всю необходимую информацию для вызова того же метода, в котором вы находитесь, и просто вернуться.
Как только переход завершится, условие больше не будет выполнено, и может появиться новая анимация. Этот метод не подвержен сложностям синхронизации, которые могут произойти, если вы просто вызовете performSelector:withObject:withDelay:
один раз.
Я использовал это совсем недавно, и он работает очень хорошо (у меня просто получилось, что выход в главное окно делает это еще проще):
//Called after [initialRootViewController dismissModalViewControllerAnimated:YES]
- (void)showTable {
if([initialRootViewController.view superview] != window) {
//View is still animating
[self performSelector:@selector(showTable) withObject:nil afterDelay:0.1];
return;
}
self.nibContents = [[NSBundle mainBundle] loadNibNamed:@"MainView" owner:self options:nil];
[UIView transitionFromView:initialRootViewController.view toView:rootViewController.view duration:0.3 options:UIViewAnimationOptionTransitionCurlUp|UIViewAnimationOptionBeginFromCurrentState completion:^(BOOL finished){
self.initialRootViewController = nil;
}];
}