【发布时间】:2012-04-11 18:42:26
【问题描述】:
我看到很多人询问如何使用默认动画以外的其他动画来推送/弹出UINavigationControllers,例如flip 或curl。
问题是问题/答案相对较旧,这意味着有一些类似[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 等动画。
第二种方法光看就感觉不对。它首先使用未记录的转换类型(即不存在于来自CATransition Class Reference 的Common transition types documentation 中),这可能会导致您的应用被 App Store 拒绝(我的意思是我可能找不到任何应用被拒绝的参考,因为它正在使用它交易,我也希望对此事做出任何澄清),但它为您的动画提供了更大的灵活性,因为我可以使用其他动画类型,例如“cameraIris”、“rippleEffect”等。
关于这一切,当我需要更高级的UINavigationController 过渡时,我真的需要呼吁QuartzCore 和CoreAnimation 吗?有没有其他方法可以仅使用UIKit 来实现相同的效果?
如果不是,使用“flip”和“cube”之类的字符串值而不是预定义的常量(kCATransitionFade、kCATransitionMoveIn 等...)是否会成为我在应用商店?
另外,这两种方法是否还有其他优缺点可以帮助我决定是否选择其中一种?
【问题讨论】:
标签: iphone ios uinavigationcontroller uikit core-animation