#iphone #cocoa-touch #uinavigationcontroller #core-animation #catransition
#iPhone #cocoa-touch #uinavigationcontroller #ядро-анимация #переход
Вопрос:
У меня есть UINavigationController. Я сделал VC1 RootViewController и программно загрузил VC2 из VC1, а затем настроил пользовательскую анимацию для перехода с VC1 на VC2. Стандартно. Все в порядке и хорошо.
Теперь я хотел бы иметь пользовательскую анимацию между ними следующим образом:
В итоге VC1 исчезает из поля зрения, в то время как VC2 находится под ним. Точно так же, как стопка бумаги, когда вы отодвигаете первый лист (VC1) и, таким образом, открываете лист под ним (VC2).
Итак, я попробовал следующий код, который вызывается из VC1, чтобы перейти к VC2. Но с этим есть проблемы:
MyVC2 *vctwo = [[[MyVC2 alloc] init] autorelease];
CATransition *transition = [CATransition animation];
transition.duration = 1;
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
transition.type = kCATransitionReveal;
transition.subtype = kCATransitionFromRight;
transition.delegate = self;
[self.navigationController.view.layer addAnimation:transition forKey:nil];
[[self navigationController] pushViewController:vctwo animated:YES];
Проблемы заключаются в следующем:
- VC2 не фиксируется в фоновом режиме. Он также скользит (хотя я указал kCATransitionReveal). Я хочу, чтобы VC2 был полностью исправлен в фоновом режиме.
- VC1 исчезает. Я действительно не знаю, почему. Я не использовал kCATransitionFade или тому подобное, поэтому я не вижу, откуда происходит исчезновение.
Любые предложения, почему я не получаю ожидаемых результатов, были бы очень признательны. Извините, если это очевидно, но я пытаюсь это уже несколько часов и очень расстроен.
Ответ №1:
Я думаю, вам следует использовать [[self navigationController] pushViewController:vctwo animated:NO];
, а не animated:YES
.
Комментарии:
1. Спасибо, Оле, я изменил его, и VC2 больше не перемещается. Следовало подумать об этом. Есть какие-нибудь мысли о затухании? Я все еще не вижу, откуда берется анимация исчезновения.
2. Я думаю, что исчезновение на самом деле является неотъемлемой частью анимации UINavigationController, и я, похоже, не могу от нее избавиться. Знаете ли вы какой-либо способ отключить пользовательскую анимацию затухания, реализуемую UINavigationController?
Ответ №2:
Я полагаю, единственный способ сделать это — забыть UINavigationController и придумать свой собственный механизм для обработки всего:
В этом блоге объясняется, как это сделать…
Поэтому, если вы хотите настроить анимацию между VCS, не используйте UINavigationController. Вот пример кода для переключения между двумя VCS, как описано выше:
-(void)slideDoorOpenTo:(UIViewController *)aController duration:(float)aDuration {
[aController viewWillAppear:YES];
[activeController viewWillDisappear:YES];
//aController.view.alpha = 0.0f;
[self.view insertSubview:aController.view belowSubview:activeController.view]; // so that it is below activeController
[aController viewDidAppear:YES];
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:aDuration];
aController.view.transform = CGAffineTransformMakeTranslation(0,0);
activeController.view.transform = CGAffineTransformMakeTranslation(-320,0);
[UIView commitAnimations];
[self performSelector:@selector(animationDone:) withObject:aController afterDelay:aDuration];
}