zoukankan      html  css  js  c++  java
  • ViewController之间的切换动画

    一 、API介绍

    iOS7开始,苹果推出了自定义转场动画API。从此,任何可以用Core Animation实现的动画,都可以出现在两个ViewController的切换之间

    知识点图:

     

    从上图可以看出,新的Api主要提供了2中VC切换方式,动画式切换,交互式切换。

    二 、动画式切换,实现方法:

    1,创建继承自NSObject并且声明 UIViewControllerAnimatedTransitioning的动画类;

    #import <UIKit/UIKit.h>
    @interface PagingTransition : NSObject<UIViewControllerAnimatedTransitioning>
    
    @end
    

    2,重载 UIViewControllerAnimatedTransitioning 中的协议方法。 

    #import "PagingTransition.h"
    
    @implementation PagingTransition
    
    //返回动画的时间
    - (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext
    {
        
        return  1;
        
    }
    //在进行切换的时候将调用该方法,我们对于切换时的UIView的设置和动画都在这个方法中完成。
    - (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext
    {
        
        UIViewController* toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
        UIViewController* fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
        [[transitionContext containerView] addSubview:toVC.view];
        
        /**
         *  效果1
         */
        
        toVC.view.alpha = 0;
        
        [UIView animateWithDuration:[self transitionDuration:transitionContext] animations:^{
            fromVC.view.transform = CGAffineTransformMakeScale(0.1, 0.1);
            toVC.view.alpha = 1;
        } completion:^(BOOL finished) {
            fromVC.view.transform = CGAffineTransformIdentity;
            [transitionContext completeTransition:![transitionContext transitionWasCancelled]];
            
        }];
        
        /**
         *  另一种效果
         */
    //    CGRect  finalRect = [transitionContext finalFrameForViewController:toVC];
    //    
    //    toVC.view.frame = CGRectOffset(finalRect, 0, [[UIScreen mainScreen]bounds].size.height);
    //    
    //    [UIView animateWithDuration:[self transitionDuration:transitionContext] delay:0.0 usingSpringWithDamping:0.8 initialSpringVelocity:0.0 options:UIViewAnimationOptionCurveLinear animations:^{
    //        toVC.view.frame = finalRect;
    //    } completion:^(BOOL finished) {
    //        //5
    //        [transitionContext completeTransition:YES];
    //    }];
    //    
    }
    
    @end

    3, 在ViewController中实现 UINavigationControllerDelegate 方法,并指定delegate。

    self.navigationController.delegate = self;
    #pragma mark--  UINavigationControllerDelegate
    - (id<UIViewControllerAnimatedTransitioning>) navigationController:(UINavigationController *)navigationController
         animationControllerForOperation:(UINavigationControllerOperation)operation   fromViewController:(UIViewController*)fromVC
         toViewController:(UIViewController*)toVC
    {
        if (operation == UINavigationControllerOperationPush) {
            PagingTransition *ping = [PagingTransition new];
            return ping;
        }
        return nil;
    }

    三、交互式切换 ,会根据交互式手势来切换VC并同时播放动画效果。 

    参考: http://www.cocoachina.com/industry/20140623/8918.html

    例子:https://github.com/PeteC/InteractiveViewControllerTransitions

     

  • 相关阅读:
    php实现拼图滑块验证的思考及部分实现
    【php设计模式】门面模式
    【php设计模式】装饰器模式
    php 如何将image图片转化为字符串(GD库操作及imagick两种实现方式)
    【php设计模式】组合模式
    【php设计模式】桥接模式
    深拷贝和浅拷贝
    【php设计模式】适配器模式
    【php设计模式】建造者模式
    Java50道经典习题-程序29 求矩阵对角线之和
  • 原文地址:https://www.cnblogs.com/developer-qin/p/4939531.html
Copyright © 2011-2022 走看看