更改UINavigationController过渡效果的正确方法是什么

时间:2012-04-11 18:42:27

标签: iphone ios uinavigationcontroller uikit core-animation

我见过很多人询问如何推送/弹出UINavigationController除了默认值之外的其他动画,例如flipcurl

问题是问题/答案是相对陈旧的,这意味着有一些事情,如[UIView beginAnimations:](例如here),或者他们使用两种截然不同的方法。

第一种是在推动控制器之前使用UIView的transitionFromView:toView:duration:options:completion:选择器(动画标志设置为NO),如下所示:

UIViewController *ctrl = [[UIViewController alloc] init];
[UIView transitionFromView:self.view 
                toView:ctrl.view 
                duration:1 
                options:UIViewAnimationOptionTransitionFlipFromTop
                completion:nil];

[self.navigationController pushViewController:ctrl animated:NO];

另一个是使用CoreAnimation明确使用CATransaction,如下所示:

// remember you will have to have the QuartzCore framework added to your project for this approach and also add <QuartzCore/QuartzCore.h> to the class this code is used
CATransition* transition = [CATransition animation];
transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
transition.duration = 1.0f;
transition.type =  @"flip"; 
transition.subtype = @"fromTop"; 
[self.navigationController.view.layer removeAllAnimations];
[self.navigationController.view.layer addAnimation:transition forKey:kCATransition];

UIViewController *ctrl = [[UIViewController alloc] init];
[self.navigationController pushViewController:ctrl animated:NO];

两种方法都有利弊。

第一种方法为我提供了更清晰的代码,但限制我使用“suckEffect”,“cube”和others之类的动画。

第二种方法只是通过观察它感觉不对。它首先使用未记录的转换类型(即来自Common transition types documentationCATransition Class Reference中不存在),这可能会使您的应用程序从App Store中被拒绝(我的意思是因为我找不到任何被拒绝的应用程序参考,因为它正在使用这些交易,我也很欣赏这个问题的任何澄清),但它为你的动画提供了更大的灵活性,因为我可以使用其他动画类型,如“cameraIris”,“rippleEffect”等。 / p>

关于这一切,每当我需要更高级的QuartzCore转换时,我是否真的需要为CoreAnimationUINavigationController提出申诉?有没有其他方法可以仅使用UIKit来实现相同的效果?

如果没有,那么使用像“flip”和“cube”这样的字符串值而不是预定义的常量(kCATransitionFadekCATransitionMoveIn等等)是否会成为我的问题App Store中的应用程序批准?

此外,这两种方法还有其他优点和缺点可以帮助我决定是否选择其中的每一种吗?

1 个答案:

答案 0 :(得分:1)

关于AppStore批准,我不认为它是基于你使用的动画库的交易破坏者。你可以使用哪种方式对你很方便,也可以一起使用。从个人的角度来看,我会说CoreAnimation&amp;当您尝试向特定事件添加动画时,QuartzCore非常棒。它很棒,因为您可以添加到单个组件的详细程度。

但那些不是你唯一的选择。你应该看一下动态的COCOS2D库。它们非常棒,使用起来非常简单。例如,如果使用CoreAnimation占用30行代码,则可以使用COCOS2D并使用3-5行代码进行设置。此外,当您使用COCOS2D框架(chipmunk)时,您可以将Physics与每个组件集成。