Настройка анимации UINavigationController: переход

#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];
  

Проблемы заключаются в следующем:

  1. VC2 не фиксируется в фоновом режиме. Он также скользит (хотя я указал kCATransitionReveal). Я хочу, чтобы VC2 был полностью исправлен в фоновом режиме.
  2. 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];


}