ios转场动画初解

本文只是写给自己,记录自己的学习过程,如果有不对的地方,欢迎大家指点

主要参考http://www.jianshu.com/p/ea0132738057  与  https://onevcat.com/2013/10/vc-transition-in-ios7/

本质 就是界面跳转时的动画

iOS有自带的present -- dismiss push -- pop 但是当想有更炫的界面切换时就需要自己设计了

首先  有两个需要区分的概念   开始看觉着这两个概念没什么用  但是自己做了几次  才发现里面的关键   下面是直接贴的  偷个懒

From和To

在代码和文字中,经常会出现fromView和toView。如果错误的理解它们的含义会导致动画逻辑完全错误。fromView表示当前视图,toView表示要跳转到的视图。如果是从A视图控制器present到B,则A是from,B是to。从B视图控制器dismiss到A时,B变成了from,A是to

Presented和Presenting

这也是一组相对的概念,它容易与fromView和toView混淆。简单来说,它不受present或dismiss的影响,如果是从A视图控制器present到B,那么A总是B的presentingViewController,B总是A的presentedViewController。

既然是动画这里就需要有地方写自己的动画

一个实现了UIViewControllerAnimatedTransitioning的类

协议中有两个方法需要实现  1,动画执行时间  2,动画执行动画

详细解析下2

一般所需方法:

viewForKey:    通过ViewKey  获取到fromView  与  toView

viewControllerForKey: 通过ControllerKey获取到 fromViewController 与 toViewController

initialFrameForViewController:获取到ViewController的初始位置 可填入之前获取到的fromViewController 与 toViewController

finalFrameForViewController:获取到ViewController的结束位置 同上

containerView:获取到转场动画将会在这个view中进行处理 

简单例子:

-(void)animateTransition:(id)transitionContext{

UIViewController*toVC = [transitionContextviewControllerForKey:UITransitionContextToViewControllerKey];

UIViewController*fromVC = [transitionContextviewControllerForKey:UITransitionContextFromViewKey];

UIView*toView;

UIView*fromView;

if([selfrespondsToSelector:@selector(viewForKey:)]) {

toView = [transitionContextviewForKey:UITransitionContextToViewKey];

fromView = [transitionContextviewForKey:UITransitionContextFromViewKey];

}else{

toView = toVC.view;

fromView = fromVC.view;

}

CGRect finalFrame = [transitionContext finalFrameForViewController:toVC];

CGRect screenBounds = [UIScreen mainScreen].bounds;

CGRect initialFrame =CGRectOffset(finalFrame, screenBounds.size.width,0);

toView.frame= initialFrame;

UIView*containView = [transitionContext containerView];

[containViewaddSubview:toView];

[UIView animateWithDuration:[self transitionDuration:transitionContext]animations:^{

toView.frame= finalFrame;

}completion:^(BOOL finished) {

[transitionContext completeTransition:YES];

}];

}

这里说两个坑点

1.   一定要有completion: 一定要有结果处理  换句话说  一定要执行[transitionContext completeTransition:YES]这个方法  否侧你会发现   你点击进入下一个界面  就再也回不来了

2.如果你要用 以下方式结束

BOOLisCancel = [transitionContext transitionWasCancelled];

[transitionContext completeTransition:!isCancel];

请一定注意有一个"!"   请一定注意  否则你会发现跟上面一样的问题

之后呢,就需要回到viewController里面  然后遵守一个UIViewControllerTransitioningDelegate协议  这个协议是viewController自带的  自己找了半天  如果是A 跳 B b.transitioningDelegate = self就ok了

之后就是实现协议里面的方法

你可能感兴趣的:(ios转场动画初解)