王巍的博客 WWDC 2013 Session笔记 - iOS7中的ViewController切换
王巍博客, iOS7 自定义 ViewController 动画切换总结:
1、相关 API 的说明:
** UIViewControllerTransitioning.h **
- 关于 @protocol UIViewControllerContentTransitioning 协议,这个接口用来提供切换的上下文给开发者使用,包含从哪个 vc 到哪个 vc, 一般不需要开发者实现。(i0S7 的自定义切换的目的之一就是切换相关代码的解耦, 在进行 VC 切换时, 做切换效果的时候必须需要切换后的 vc 一些信息。 )
- 对切实现:(接口方法的说明)
1>.-(UIView *)containerView;
VC切换所发生的view容器。(开发者应该将切出的view移除,将切入的view加入到该view容器中。)
2>.-(UIViewController *)viewControllerForKey:(NSString *)key;
提供一个key,返回对应的VC。现在的SDK中key的选择只有UITransitionContextFromViewControllerKey和UITransitionContextToViewControllerKey两种,分别表示将要切出和切入的VC。
3>.-(CGRect)initialFrameForViewController:(UIViewController *)vc;
某个VC的初始位置,可以用来做动画的计算。
4>.-(void)completeTransition:(BOOL)didComplete;
向这个context报告切换已经完成。
** UIViewControllerAnimatedTransitioning **
- 这个接口负责的具体内容是: 切换中应该发生什么。 (开发者在做自定义切换效果的时候大部分代码都在这里)
- 切换实现:
1>.-(NSTimeInterval)transitionDuration:(id < UIViewControllerContextTransitioning >)transitionContext;
系统给出一个切换上下文,我们根据上下文环境返回这个切换所需要的花费时间(一般就返回动画的时间就好了,SDK会用这个时间来在百分比驱动的切换中进行帧的计算,后面再详细展开)。
2>.-(void)animateTransition:(id < UIViewControllerContextTransitioning >)transitionContext;
在进行切换的时候将调用该方法,我们对于切换时的UIView的设置和动画都在这个方法中完成。
** UIViewControllerTransitioningDelegate **
这个接口的作用比较单一:需要 VC 切换的时候系统会像实现了这个接口的对象询问是否需要使用自定义的切换效果。
-
实现:
1>.
-(id< UIViewControllerAnimatedTransitioning >)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
2>.
-(id< UIViewControllerAnimatedTransitioning >)animationControllerForDismissedController:(UIViewController *)dismissed;
3>. -(id< UIViewControllerInteractiveTransitioning >)interactionControllerForPresentation:(id < UIViewControllerAnimatedTransitioning >)animator;
4>. -(id< UIViewControllerInteractiveTransitioning >)interactionControllerForDismissal:(id < UIViewControllerAnimatedTransitioning >)animator;
前两个方法是针对动画切换的,我们需要分别在呈现VC和解散VC时,给出一个实现了UIViewControllerAnimatedTransitioning接口的对象(其中包含切换时长和如何切换)。后两个方法涉及交互式切换,之后再说。