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

Posted

技术标签:

【中文标题】更改 UINavigationController 过渡效果的正确方法是啥【英文标题】:What is the proper way to change the UINavigationController transition effect更改 UINavigationController 过渡效果的正确方法是什么 【发布时间】:2012-04-11 18:42:26 【问题描述】:

我看到很多人询问如何使用默认动画以外的其他动画来推送/弹出UINavigationControllers,例如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];

另一种方法是明确使用CoreAnimationCATransaction,如下所示:

// 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 等动画。

第二种方法光看就感觉不对。它首先使用未记录的转换类型(即不存在于来自CATransition Class Reference 的Common transition types documentation 中),这可能会导致您的应用被 App Store 拒绝(我的意思是我可能找不到任何应用被拒绝的参考,因为它正在使用它交易,我也希望对此事做出任何澄清),但它为您的动画提供了更大的灵活性,因为我可以使用其他动画类型,例如“cameraIris”、“rippleEffect”等。

关于这一切,当我需要更高级的UINavigationController 过渡时,我真的需要呼吁QuartzCoreCoreAnimation 吗?有没有其他方法可以仅使用UIKit 来实现相同的效果?

如果不是,使用“flip”和“cube”之类的字符串值而不是预定义的常量(kCATransitionFadekCATransitionMoveIn 等...)是否会成为我在应用商店?

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

【问题讨论】:

【参考方案1】:

关于 AppStore 的批准,根据您使用的动画库,我不认为它会破坏交易。你可以使用任何你觉得方便的,也可以一起使用。从个人的角度来看,当您尝试为特定事件添加动画时,我会说CoreAnimationQuartzCore 非常棒。它很棒,因为您可以添加到各个组件的详细程度。

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

【讨论】:

我之前尝试过 cocos2d,在 1.0 发布之前,据我记得我不能将他们的动画与 UIKit 一起使用,我的意思是,我不得不使用他们的 CCxxx 类,比如 CCSprites 或像这样的东西......所以可以在我的UINavigationController中推送UIViewControlller时使用他们的动画框架?那将是真棒!如果是这样,你能提供一些如何实现的代码吗? 我不认为这是可能的,Cocos2D 使用 OpenGL 并管理它自己的视图等。

以上是关于更改 UINavigationController 过渡效果的正确方法是啥的主要内容,如果未能解决你的问题,请参考以下文章

更改 UINavigationController 中的视图高度

Swift:更改 UINavigationController 视图的高度

快速更改UITabBar中“更多” UINavigationController的背景颜色

更改 UINavigationController 颜色和字体

UINavigationController 背景颜色更改在 iOS 中隐藏后退按钮

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