Настройка анимации UINavigationController: CATransition - PullRequest
5 голосов
/ 05 октября 2011

У меня есть UINavigationController.Я сделал VC1 rootViewController и программно загружаю VC2 из VC1, а затем настраиваю анимацию для перехода из VC1 в VC2.Стандарт.Все хорошо и хорошо.

Теперь я хотел бы иметь собственную анимацию между ними, вот так: Custom animation

В сумме 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 и т. П., Поэтому я не вижу, откуда происходит это затухание.

Любые предложения, почему я не получаю ожидаемых результатов, будут очень благодарны.Извините, если это очевидно, но я пытаюсь сделать это часами и очень расстроился.

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Я думаю, вы должны использовать [[self navigationController] pushViewController:vctwo animated:NO]; вместо animated:YES.

1 голос
/ 06 октября 2011

Полагаю, единственный способ сделать это - забыть UINavigationController и придумать свой собственный механизм для обработки всего:

Этот блог объясняет, как ...

Так что, если вы хотите настраивать анимацию между VC, не используйте UINavigationController.Вот пример кода для обмена между двумя VC, как описано выше:

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


}
...