美文网首页
ios转场动画总结

ios转场动画总结

作者: 风车大战骑士 | 来源:发表于2017-11-11 17:04 被阅读102次

    1.简单push动画和present动画

    [self.navigationController.view.layer addAnimation:[self pushAnimation] forKey:@""];
    [self.navigationController pushViewController:[] animated:NO];
    
    [self.view.window.layer addAnimation:[self presentAnimation] forKey:nil];
    [self presentViewController:second animated:NO completion:nil]; 
    
    //系统的API
    - (void)addAnimation:(CAAnimation *)anim forKey:(nullable NSString *)key;
    

    自定义push动画,然后在push时添加到navigationController中
    CATransition -> CAAnimation -> NSObject

        CATransition *transition = [CATransition animation];
        transition.duration = 0.6;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
        
        //动画类型,一下是系统API的介绍
        /* The name of the transition. Current legal transition types include
         * `fade', `moveIn', `push' and `reveal'. Defaults to `fade'. */
        transition.type = @"";
    
        /*私有API
         cube                   立方体效果
         pageCurl               向上翻一页
         pageUnCurl             向下翻一页
         rippleEffect           水滴波动效果
         suckEffect             变成小布块飞走的感觉
         oglFlip                上下翻转
         cameraIrisHollowClose  相机镜头关闭效果
         cameraIrisHollowOpen   相机镜头打开效果
         */
    

    最后push或present页面就可以完成动画

    2.非交互式转场动画

    1.需要当前的navigationController遵循<UINavigationControllerDelegate>并实现其代理方法

    -  (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                       animationControllerForOperation:(UINavigationControllerOperation)operation
                                                    fromViewController:(UIViewController *)fromVC
                                                      toViewController:(UIViewController *)toVC 
    

    可以在此代理方法中判断当前是push还是pop

    2.我们需要在代理方法中返回一个UIViewControllerAnimatedTransitioning对象,于是我们创建一个类继承自NSObject,遵循<UIViewControllerAnimatedTransitioning>协议,并实现其代理方法
    代理方法主要有以下2个

    // This is used for percent driven interactive transitions, as well as for
    // container controllers that have companion animations that might need to
    // synchronize with the main animation.
    - (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
    
    // This method can only  be a nop if the transition is interactive and not a percentDriven interactive transition.
    - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
    

    第一个方法将返回动画的时长
    第二个方法将具体实现动画

    //转场过渡的容器view
    UIView *containerView = [transitionContext containerView];
    //FromVC
    UIViewController *fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
    UIView *fromView = fromViewController.view;
    
    //ToVC
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *toView = toViewController.view;
    
    NSInteger toVCCount = [toViewController.navigationController.viewControllers indexOfObject:toViewController];
    NSInteger fromVCCount = [fromViewController.navigationController.viewControllers indexOfObject:fromViewController];
    if (toVCCount > fromVCCount) {
       //push
        [containerView addSubview:fromView];
        [containerView addSubview:toView];
    }
    else{
      //pop
        [containerView addSubview:toView];
        [containerView addSubview:fromView];
    }
    
    [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            //具体的动画实现
    
      } completion:^(BOOL finished) {
            BOOL wasCancelled = [transitionContext transitionWasCancelled];
            //设置transitionContext通知系统动画执行完毕
            [transitionContext completeTransition:!wasCancelled];
    }];
    

    实现酷狗的转场动画
    分别创建两个类继承自NSObject,遵循<UIViewControllerAnimatedTransitioning>协议,来实现push和pop的动画效果

    1.push动画,将将push的view做仿射变换

    - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext;
    
    //转场过渡的容器view
    UIView *containerView = [transitionContext containerView];
    //ToVC
    UIViewController *toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
    UIView *toView = toViewController.view;
    [containerView addSubview:toView];
    
    //将toView绕原点旋转45度
    toView.transform = 
    

    2.pop动画同理

    3.交互式转场动画

    <UINavigationControllerDelegate>实现其代理方法

    - (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
                              interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController
    

    实现这个方法,系统转场时,就会知道当前是否有交互式的转场,有便执行交互转场,无则执行普通自定义的转场动画
    UIPercentDrivenInteractiveTransition类是系统定义的,他遵循UIViewControllerInteractiveTransitioning协议
    此类提供了了以下方法

    // These methods should be called by the gesture recognizer or some other logic
    // to drive the interaction. This style of interaction controller should only be
    // used with an animator that implements a CA style transition in the animator's
    // animateTransition: method. If this type of interaction controller is
    // specified, the animateTransition: method must ensure to call the
    // UIViewControllerTransitionParameters completeTransition: method. The other
    // interactive methods on UIViewControllerContextTransitioning should NOT be
    // called. If there is an interruptible animator, these methods will either scrub or continue 
    // the transition in the forward or reverse directions.
    
    - (void)updateInteractiveTransition:(CGFloat)percentComplete;
    - (void)cancelInteractiveTransition;
    - (void)finishInteractiveTransition;
    

    根据pop时传递的手势信息来计算滑动百分比,从而完成交互动画和取消动画

    相关文章

      网友评论

          本文标题:ios转场动画总结

          本文链接:https://www.haomeiwen.com/subject/jxzwmxtx.html