自定义UINavigationController的push和pop动画

自定义UINavigationController的push和pop动画

我们这里先创建一个简单的工程 , 在storyboard 中拖一个导航控制器 , rootViewController 改成我们的ViewController 。

为了实现自定义动画切换 , 我们需要实现两个协议 。 UIViewControllerAnimatedTransitioning,UINavigationControllerDelegate

UIViewControllerAnimatedTransitioning 这个协议目的是在需要使用自定义动画的同时,又不影响视图的其他属性,让你把焦点集中在动画实现的本身上,然后通过在这个协议的回调里编写自定义的动画代码,,负责切换的具体内容,任何实现了这一协议的对象被称之为动画控制器。

其中有两个比较重要的方法:

transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeIntervalanimateTransition(transitionContext: UIViewControllerContextTransitioning)

第一个返回一个动画持续时间就行了 , 第二个是动画主体 。transitionContext 在这里是一个核心 ,通过这个对象能获取到切换时的上下文信息,比如从哪个VC切换到哪个VC等。

let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey);//let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey);let container = transitionContext.containerView()container!.addSubview((toViewController?.view)!);if oper == UINavigationControllerOperation.Push {toViewController?= CGPointMake(0, 0)toViewController?.view.center = CGPointMake(0, 0)toViewController?.view.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2))UIView.animateWithDuration(self.transitionDuration(transitionContext), delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.7, options: UIViewAnimationOptions.AllowUserInteraction, animations: { () -> Void intoViewController?.view.transform = CGAffineTransformMakeRotation(0)}, completion: { (b) -> Void intoViewController?.view.transform = CGAffineTransformIdentity//动画完成//没有取消就执行完成 取消了 就不能完成transitionContext.completeTransition(!transitionContext.transitionWasCancelled())})}else if oper == UINavigationControllerOperation.Pop{toViewController?= CGPointMake(1,0) //0-1之间 不要犯傻。。toViewController?, 0)toViewController?.view.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2*3))UIView.animateKeyframesWithDuration(1.3, delay: 0, options: UIViewKeyframeAnimationOptions.AllowUserInteraction, animations: { () -> Void inUIView.addKeyframeWithRelativeStartTime(0.0, relativeDuration: 0.4, animations: { () -> Void intoViewController?.view.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2)*4)})UIView.addKeyframeWithRelativeStartTime(0.4, relativeDuration: 0.2, animations: { () -> Void intoViewController?.view.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_2/10))})UIView.addKeyframeWithRelativeStartTime(0.6, relativeDuration: 0.3, animations: { () -> Void intoViewController?.view.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI_2)*4)})}, completion: { (b) -> Void intoViewController?.view.transform = CGAffineTransformIdentityprint(transitionContext.transitionWasCancelled())//动画完成//没有取消就执行完成 取消了 就不能完成transitionContext.completeTransition(!transitionContext.transitionWasCancelled())})}

这里是我写的一段代码, 当然我这里分了pop 和 push, oper 变量是从另一个方法中获得的,下面会说 。to 和 from没啥说的 ,container这是一个特殊的容器,切换时的动画将在这个容器中进行。其他的就是push和pop 我自己做得一个动画主体 。当然你可以根据你的需求更改这些部分 。这里主要讲自定义 , 不讲动画。

我们还需要实现另一个协议UINavigationControllerDelegate ,这个协议用来配置一些导航控制器的交互方式等。

在我们的类中定义 var navgationController:UINavigationController

初始化的时候

init(nav:UINavigationController){self.navgationController = navsuper.init()= self} func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {oper = operationreturn self}人若勇敢就是自己最好的朋友

自定义UINavigationController的push和pop动画

相关文章:

你感兴趣的文章:

标签云: