自定义UINavigationController动画:CATransition

5
我有一个UINavigationController。我把VC1设置为根视图控制器,然后从VC1编程加载VC2,并使用自定义动画从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
我认为你应该使用 [[self navigationController] pushViewController:vctwo animated:NO]; 而不是 animated:YES

谢谢Ole,我已经更改了代码,现在VC2不再移动了。本应该早点想到这个问题的。不过你有没有关于淡出效果的想法呢?我仍然看不出淡出动画是从哪里来的。 - n.evermind
我认为淡入淡出实际上是UINavigationController动画的一部分,我似乎无法摆脱它。你知道有什么方法可以禁用UINavigationController实现的自定义淡入淡出动画吗? - n.evermind

1

我想唯一的方法就是放弃使用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];


}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接