iOS CAAnimation之CATransition(自定义转场动画)

来源:互联网 发布:vb 字符串拷贝函数 编辑:程序博客网 时间:2024/04/28 11:40

一、 参考资料:

1.王巍 《博客》(非常详细,推荐阅读)
https://onevcat.com/2013/10/vc-transition-in-ios7/
2.xiao333ma 《博客》
http://blog.csdn.net/xiao333ma/article/details/49028241#t1

二、protocol
1.@protocol UIViewControllerContextTransitioning

  1. 这个接口用来提供切换上下文给开发者使用,包含了从哪个VC到哪个VC等各类信息,一般不需要开发者自己实现。具体来说,iOS7的自定义切换目的之一就是切换相关代码解耦,在进行VC切换时,做切换效果实现的时候必须要需要切换前后VC的一些信息。
  2. 重要的方法:
    1.-(UIView *)containerView;
-(UIView *)containerView; VC切换所发生的view容器,开发者应该将切出的view移除,将切入的view加入到该view容器中。

2.-(UIViewController )viewControllerForKey:(NSString )key;

-(UIViewController *)viewControllerForKey:(NSString *)key; 提供一个key,返回对应的VC。现在的SDK中key的选择只有:UITransitionContextFromViewControllerKey表示将要切出VC。UITransitionContextToViewControllerKey表示将要切入的VC。

3.-(CGRect)initialFrameForViewController:(UIViewController *)vc;

-(CGRect)initialFrameForViewController:(UIViewController *)vc; 某个VC的初始位置,可以用来做动画的计算。-(CGRect)finalFrameForViewController:(UIViewController *)vc; 与上面的方法对应,得到切换结束时某个VC应在的frame。

4.-(void)completeTransition:(BOOL)didComplete;

-(void)completeTransition:(BOOL)didComplete; 向这个context报告切换已经完成。

2.@protocol UIViewControllerAnimatedTransitioning

  1. 这个接口负责切换的具体内容,也即“切换中应该发生什么”。开发者在做自定义切换效果时大部分代码会是用来实现这个接口。
  2. 重要的方法:
    1.-(NSTimeInterval)transitionDuration:(id < UIViewControllerContextTransitioning >)transitionContext;
-(NSTimeInterval)transitionDuration:(id < UIViewControllerContextTransitioning >)transitionContext; 系统给出一个切换上下文,我们根据上下文环境返回这个切换所需要的花费时间(一般就返回动画的时间就好了,SDK会用这个时间来在百分比驱动的切换中进行帧的计算)

2.-(void)animateTransition:(id < UIViewControllerContextTransitioning >)transitionContext;

-(void)animateTransition:(id < UIViewControllerContextTransitioning >)transitionContext; 在进行切换的时候将调用该方法,我们对于切换时的UIView的设置和动画都在这个方法中完成。

3.@protocol UIViewControllerTransitioningDelegate

  1. 这个接口的作用比较简单单一,在需要VC切换的时候系统会像实现了这个接口的对象询问是否需要使用自定义的切换效果。
  2. 这个接口共有四个类似的方法:
    前两个方法是针对动画切换的,我们需要分别在呈现VC和解散VC时,给出一个实现了UIViewControllerAnimatedTransitioning接口的对象(其中包含切换时长和如何切换)。后两个方法涉及交互式切换
-(id< UIViewControllerAnimatedTransitioning >)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
-(id< UIViewControllerAnimatedTransitioning >)animationControllerForDismissedController:(UIViewController *)dismissed;
-(id< UIViewControllerInteractiveTransitioning >)interactionControllerForPresentation:(id < UIViewControllerAnimatedTransitioning >)animator;
-(id< UIViewControllerInteractiveTransitioning >)interactionControllerForDismissal:(id < UIViewControllerAnimatedTransitioning >)animator;

三、没有交互的代码具体思想步骤
注意,转场动画不难,但是套路一定要明显,我们都是有原则的人。
* 情景: VC_a跳到VC_b

1.创建VC_a
并且在init方法里面设置代理和modalPresentationStyle

- (instancetype)init{    self = [super init];    if (self) {        self.transitioningDelegate = self;        self.modalPresentationStyle = UIModalPresentationCustom;    }    return self;}

2.VC_a 遵守协议UIViewControllerTransitioningDelegate

  1. 这时候要实现协议的四个方法:
    方法都返回了一个遵守UIViewControllerAnimatedTransitioning的id类型的动画类
-(id< UIViewControllerAnimatedTransitioning >)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;-(id< UIViewControllerAnimatedTransitioning >)animationControllerForDismissedController:(UIViewController *)dismissed;-(id< UIViewControllerInteractiveTransitioning >)interactionControllerForPresentation:(id < UIViewControllerAnimatedTransitioning >)animator;-(id< UIViewControllerInteractiveTransitioning >)interactionControllerForDismissal:(id < UIViewControllerAnimatedTransitioning >)animator;

3.创建 AnimationTool (一个继承自NSObject的动画类)
并且AnimationTool遵守UIViewControllerAnimatedTransitioning协议

4.这是后我们可以从AnimationTool的协议方法实现对应的转场方法(一般都用UIView的类动画方法或者用layer动画)

1.返回时长的方法

//返回的是动画时长- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{    return 0.5;}

2.//具体动画的实施的方法

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{    //这里面分为modal和dismiss 两种情况    }

四、有交互代码实现思路 —— 手势驱动的百分比切换
1. 创建一个UIPercentDrivenInteractiveTransition 类

1.这是一个实现了UIViewControllerInteractiveTransitioning接口的类,为我们预先实现和提供了一系列便利的方法,可以用一个百分比来控制交互式切换的过程。一般来说我们更多地会使用某些手势来完成交互式的转移。

  1. 本类中重要的方法
-(void)updateInteractiveTransition:(CGFloat)percentComplete;//更新百分比,一般通过手势识别的长度之类的来计算一个值,然后进行更新。
-(void)cancelInteractiveTransition ;//报告交互取消,返回切换前的状态
–(void)finishInteractiveTransition; //报告交互完成,更新到切换后的状态
  1. 给view添加手势(对于手势的总结请看 iOS 手势的基本介绍)

五、代码学习
github源码:简书作者wazrx

0 0
原创粉丝点击