本文只是写给自己,记录自己的学习过程,如果有不对的地方,欢迎大家指点
主要参考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了
之后就是实现协议里面的方法