zoukankan      html  css  js  c++  java
  • 转场动画1-Push 动画

    先上效果图:

    这篇文章完全是为造轮子制作:原作者是码农界的吴彦祖
    作者视频下载地址

    好的,我梳理一下思路:

    理清思路

    ||转场动画可以理解为一个对象,在这个对象里封装了一个动画.具体的我们跟着代码走

    !.实现协议的方法

    在一个继承NSObject的类中遵守协议实现代理

     #import <Foundation/Foundation.h>
    #import <UIKit/UIKit.h>
    @interface PushTranstion : NSObject<UIViewControllerAnimatedTransitioning>
    @property (nonatomic,strong)id transitationContext; 
    @end
    
    
    

    在这里遵守一个协议,声明一个属性变量全局操作

    方法实现

    //  PushTranstion.m
    //  专场动画
    //
    //  Created by MAc on 16/5/27.
    //  Copyright © 2016年 MAc. All rights reserved.
    //
    
    #import "PushTranstion.h"
    
    @implementation PushTranstion
    //转场动画实现的时间  这里设置的长便于观察
    - (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{
        return 4.0;
    }
    //设置动画效果
    - (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext {
          _transitationContext=transitionContext;
        UIViewController *fromViewController = [transitionContext  viewControllerForKey:UITransitionContextFromViewControllerKey];
        UIViewController * toViewController = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        UIView * containerView = [transitionContext containerView];
        [containerView addSubview:fromViewController.view];
        [containerView addSubview:toViewController.view];
        
        /* 创建一个矩阵The identity transform: [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 1]. */
    
        CATransform3D  transform = CATransform3DIdentity;
    //设置影射效果,是转场显得更真实
        transform.m34 = - 1/1500.0;
        toViewController.view.layer.transform =transform;
        //设置锚点:(边长为1,锚点指的是(0.5,0.5))
        toViewController.view.layer.anchorPoint = CGPointMake(1.0, 0.5);
        
        //设置锚点之后,试图左移动了0.5个View.With,重写设置position(锚点在俯视图中的位置,)
        /* The position in the superlayer that the anchor point of the layer's
         * bounds rect is aligned to. Defaults to the zero point. Animatable. */
        toViewController.view.layer.position= CGPointMake(CGRectGetMaxX(fromViewController.view.frame), CGRectGetMidY(fromViewController.view.frame));
        CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.y"];
        animation.duration = [self transitionDuration:transitionContext];
        //从pi/2开始旋转
        animation.fromValue = @(M_PI_2);
        animation.toValue=@(0);
        animation.delegate =self;
        [toViewController.view.layer addAnimation:animation forKey:@"rotateAnimation"];
        
    }
    //动画结束的时候通知上下文
    - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
        if (flag) {
            //[_transitationContext finishInteractiveTransition];
           [_transitationContext completeTransition:YES];
        }
    }
    @end
    
    

    转场对象设定好了,下面就去vc中实现转场动画

    在这之前,要理解一件事.转场动画的两个界面是放在一个容器里面的,即前面提到的containerView中放着的两个view,一个fromView 一个toView

    其实就是toView旋转铺在fromView上的操作 ,接着看vc中的代码

    //
    //  ViewController.m
    //  专场动画
    //
    //  Created by MAc on 16/5/27.
    //  Copyright © 2016年 MAc. All rights reserved.
    //
    
    #import "ViewController.h"
    #include "PushTranstion.h"
    //#import "PushTransitionTest.h"
    @interface ViewController ()<UINavigationControllerDelegate>{
        //和手势搭配使用,单独使用会报不知名错
        UIPercentDrivenInteractiveTransition * interaction;
    }
     
    
    @end
    
    @implementation ViewController
    - (IBAction)push:(id)sender {
        // interaction = [[UIPercentDrivenInteractiveTransition alloc] init];
        [self performSegueWithIdentifier:@"PushToS" sender:nil];
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        
    }
    -(void)viewDidAppear:(BOOL)animated{
        [super viewDidAppear:YES];
        self.navigationController.delegate = self;
    }
     
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        self.navigationController.delegate = nil;
    }
     
    - (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
                                                animationControllerForOperation:(UINavigationControllerOperation)operation
                                                             fromViewController:(UIViewController *)fromVC
                                                               toViewController:(UIViewController *)toVC
    {
        if (operation == UINavigationControllerOperationPush) {
            return [[PushTranstion alloc] init];
        }
        return nil;
    }
     
    @end
    
    

    这样,这个转场动画的效果就实现了,后面还有对吴彦祖的视频的分析讲解,不清楚的地方相互交流,欢迎留言!

    追寻最真
  • 相关阅读:
    对vue-cli各个目录的理解 和 在 vue 中使用json-server
    发论文的一些常见问题
    latex初步入门:springer llncs
    docker tomcat8 mysql8部署常见错误
    docker快速部署本地项目到服务器(tomcat8+mysql8)
    IDEA构建spring项目
    [b0042] python 归纳 (二七)_gui_tkinter_基本使用
    [b0038] python 归纳 (二三)_多进程数据共享和同步_队列Queue
    springboot进入html
    HbaseShell启动
  • 原文地址:https://www.cnblogs.com/zhao-jie-li/p/5536594.html
Copyright © 2011-2022 走看看