zoukankan      html  css  js  c++  java
  • 转场动画2-Pop动画

    上一篇试讲push动画,这篇分解pop动画
    里面关于矩阵有不懂得,参考CATransform3D 特效详解
    上图(虚拟机下,图是渣渣

    )

    代码直接上

    //
    //  PopTransition.h
    //  转场动画2-Pop
    //
    //  Created by MAc on 16/5/28.
    //  Copyright © 2016年 李赵杰. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @interface PopTransition : NSObject<UIViewControllerAnimatedTransitioning>
    /** 全局上下文  */
    @property (nonatomic,strong) id  transitionContext;
    /** fromViewController  */
    @property (nonatomic,strong) UIViewController * fromViewController;
    @end
    
    

    实现方法和Push里面基本一致

    //
    //  PopTransition.m
    //  转场动画2-Pop
    //
    //  Created by MAc on 16/5/28.
    //  Copyright © 2016年 李赵杰. All rights reserved.
    //
    
    #import "PopTransition.h"
    
    @implementation PopTransition
    - (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
        return 5.0;
    }
    - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext{
        _transitionContext = transitionContext;
        UIViewController * fromViewController = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
        UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        UIView * containerView = [transitionContext containerView];
        _fromViewController = fromViewController;
        [containerView addSubview:toViewController.view];
        [containerView addSubview:fromViewController.view];
        
        CATransform3D transform =CATransform3DIdentity;
        //这个值表示:  m34(透视效果,要操作的这个对象要有旋转的角度,否则没有效果。正直/负值都有意义)
        transform.m34 = - 1/1500.0;
        fromViewController.view.layer.transform = transform;
        fromViewController.view.layer.anchorPoint = CGPointMake(1, 0.5);
        fromViewController.view.layer.position =CGPointMake(CGRectGetMaxX(toViewController.view.frame),CGRectGetMidY(toViewController.view.frame));
        CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
        animation.duration = [self transitionDuration:transitionContext];
        animation.fromValue = @(0);
        animation.toValue =@(M_PI_2);
        animation.delegate = self;
        [fromViewController.view.layer addAnimation:animation forKey:@"rotateAnimation"];
        
        
        
    }
    -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
        if (flag) {
            // This must be called whenever a transition completes (or is cancelled.)
            // Typically this is called by the object conforming to the
            // UIViewControllerAnimatedTransitioning protocol that was vended by the transitioning
            // delegate.  For purely interactive transitions it should be called by the
            // interaction controller. This method effectively updates internal view
            // controller state at the end of the transition.
        //意思就是:必须调用在转场动画结束时(取消),....  最后这个方法有效的更新了试图控制器中转场动画的状态
            [_transitionContext completeTransition:YES];
        }
    }
    @end
    
    //
    //  PopViewController.m
    //  转场动画2-Pop
    //
    //  Created by MAc on 16/5/28.
    //  Copyright © 2016年 李赵杰. All rights reserved.
    //
    
    #import "PopViewController.h"
    #import "PopTransition.h"
    @interface PopViewController ()<UINavigationControllerDelegate>
    
    @end
    
    @implementation PopViewController
    - (void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:animated];
        self.navigationController.delegate = self;
    
    }
    -(void)viewDidDisappear:(BOOL)animated{
        [super viewDidDisappear:animated];
        self.navigationController.delegate =nil;
    }
    - (void)viewDidLoad {
        [super viewDidLoad];
          // Do any additional setup after loading the view.
    }
    
    - (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{
        if (operation == UINavigationControllerOperationPop) {
            return [[PopTransition alloc]init];
        }
        return nil;
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    /*
    #pragma mark - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
        // Get the new view controller using [segue destinationViewController].
        // Pass the selected object to the new view controller.
    }
    */
    
    @end
    

    demo地址
    下一篇解析 吴彦祖的手势,尽请期待

    追寻最真
  • 相关阅读:
    PHP FILTER_VALIDATE_REGEXP 过滤器
    PHP FILTER_VALIDATE_FLOAT 过滤器
    PHP FILTER_VALIDATE_BOOLEAN 过滤器
    PHP FILTER_VALIDATE_INT 过滤器
    PHP FILTER_UNSAFE_RAW 过滤器
    PHP addslashes() 函数
    PHP FILTER_SANITIZE_NUMBER_FLOAT 过滤器
    PHP FILTER_SANITIZE_NUMBER_INT 过滤器
    PHP FILTER_SANITIZE_URL 过滤器
    PHP FILTER_SANITIZE_EMAIL 过滤器
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/5537962.html
Copyright © 2011-2022 走看看