在看这篇文章之前,不妨先看看objccn的两篇文章
自定义 ViewController 容器转场
View Controller 转场
UIViewControllerAnimatedTransitioning
UIViewControllerAnimatedTransitioning
这个协议要求实现两个方法:- (NSTimeInterval)transitionDuration:(id <UIViewControllerContextTransitioning>)transitionContext
- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext
第一个方法指定了转场动画的持续时间,第二个方法指定了转场动画.
还可以选择性的实现这个方法:- (void)animationEnded:(BOOL)transitionCompleted;
UIViewControllerContextTransitioning
UIViewControllerContextTransitioning
代表的是转场动画的上下文环境.UIViewControllerContextTransitioning
协议里的方法都要求实现.
其中,- (UIViewController *)viewControllerForKey:(NSString *)key
这个方法要求根据key返回controller.
key分别是UITransitionContextFromViewControllerKey
,UITransitionContextToViewControllerKey
.分别指定了将要消失的controller和将要出现的controller.
转场
如果要进行转场,调用实现了UIViewControllerAnimatedTransitioning
协议的 - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
方法即可.
如果是tabBarController或者navigationController,只需要在相应的协议中实现(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC
,返回一个实现UIViewControllerAnimatedTransitioning
的类即可.
为什么两种方法不同呢,个人理解是在tabBarController或者navigationController中的转场,上下文可以由系统生成,所以不用自己实现UIViewControllerContextTransitioning
了.
在转场动画完成后,要注意把消失的view的transform属性设置为CGAffineTransformIdentity
(如果之前改变了的话).因为如果transform属性不为CGAffineTransformIdentity
,在下次转场需要显示该view时,系统将不能计算其frame的值.