美文网首页
CATransition-给push控制器添加丰富的动画效果

CATransition-给push控制器添加丰富的动画效果

作者: CoderPeak | 来源:发表于2017-03-27 13:55 被阅读0次

    利用CATransition转场动画, 结合分类特性, 给UINavigationController写一个分类, 在push控制器的时候动点小手脚, 即可实现将整个项目中所有所有push控制器的操作, 添加丰富的转场动画效果...

    效果预览图
    3d立方效果.gif 效果展示.gif

    github地址 https://github.com/CoderPeak/CFPushVCWithCATransition 喜欢的朋友们可以星一个 多谢

    之前有人面试, 被问道如何将push控制器的动画做的跟modal效果差不多... 在搜转场动画的时候, 搜到别人的demo(千篇一律的一样,你懂得,只是简单的给view的layer添加动画, 并未给出实际的项目应用场景), 进行改造... 虽然只是进行小改造, 但是, 却在项目中有大用途...

    之前看的无数片转场动画的博客, 千篇一律, 都只是简简单单的介绍api的使用(就那么几行代码--核心使用代码不超过10行), 简简单单的搬运... 实在是...
    毕竟, 知识要轮回贯通的使用,才能发挥其最大价值, 而不是简单的copy, 而不是简单的copy而不是简单的copy...... 那样只能说明苹果的api好, 而并不能说明你应用的恰当...

    简单介绍在项目中应用的思路

      1. 给UINavigationController写个分类, 为啥? push/pop控制器的操作, 不就是由UINavigationController对象管理的吗?
      1. 再给其分类添加几个对象方法, 在该对象方法中, 给当前栈顶控制器的view添加转场动画, 再调用本身的系统方法- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 即可在push控制器的时候, 添加丰富的转场动画

    代码简单介绍

    • UINavigationController+CATransition.h UINavigationController分类的头文件
    // 定义两个枚举 分别是 (目的 --- 因为动画效果众多, 此举可以方便管理动画参数 ---  .m文件中有将这些枚举"映射"为系统所需字符串的C函数)
    typedef NS_ENUM(NSInteger, CATransitionType) {
        CATransitionTypeFade = 1,      // 淡化
        CATransitionTypeMoveIn,        // 覆盖
        CATransitionTypePush,          // push
        CATransitionTypeReveal,         // 揭开 
        CATransitionTypeCube,         // 3D立方
        CATransitionTypeSuckEffect,   // 吮吸
        CATransitionTypeOglFlip,      // 翻转
        CATransitionTypeRippleEffect,  // 波纹    
        CATransitionTypePageCurl,      // 翻页
        CATransitionTypePageUnCurl,        // 反翻页
        CATransitionTypeCameraIrisHollowOpen,      // 开镜头
        CATransitionTypeCameraIrisHollowClose,     //  关镜头
    };
    
    // 上/下/左/右 4个不同方向的动画
    typedef NS_ENUM(NSInteger, CATransitionSubType) {  
        CATransitionSubTypeFromRight = 1,
        CATransitionSubTypeFromLeft,
        CATransitionSubTypeFromTop,
        CATransitionSubTypeFromBottom
    };
    
    // 添加两个对象方法---用于实现控制器跳转, 并加上动画效果 
    // 动画效果参数传入 字符串
    // push
    - (void)pushViewController:(UIViewController *)viewController withCATransitionTypeString:(NSString *)typeString subTypeString:(NSString *)subTypeString animated:(BOOL)animated;
    // pop
    - (void)popViewControllerWithCATransitionTypeString:(NSString *)typeString subTypeString:(NSString *)subTypeString animated:(BOOL)animated;
    
    // 由于字符串并没有提示, 为了方便使用, 再写两个方法, 动画效果参数传枚举, 再"映射"为系统需要的字符串(方便使用---建议使用下面两个方法、就是辣么贴心)
    // 传枚举
    // push
    - (void)pushViewController:(UIViewController *)viewController withCATransitionType:(CATransitionType)type subType:(CATransitionSubType)subType animated:(BOOL)animated;
    // pop
    - (void)popViewControllerWithCATransitionType:(CATransitionType)type subType:(CATransitionSubType)subType animated:(BOOL)animated;
    
    • UINavigationController+CATransition.m UINavigationController分类的实现文件
    // 转场动画持续时间
    #define kTransitionDuration 0.8
    // 定义一个函数, 传入动画参数的枚举值CATransitionType, 返回系统所真正需要的值---把枚举值映射为系统需要的值
    NSString *getCATransitionTypeStringWithCATransitionType(CATransitionType type) {
        switch (type) {
            case CATransitionTypeFade:
                return kCATransitionFade;  // 淡化
                break;
            case CATransitionTypeMoveIn:
                return kCATransitionMoveIn;  // 覆盖
                break;
            case CATransitionTypePush:
                return kCATransitionPush;  // push
                break;
            case CATransitionTypeReveal:
                return kCATransitionReveal;   // 揭开
                break;
            case CATransitionTypeCube:
                return @"cube";         // 3D立方
                break;
            case CATransitionTypeSuckEffect:
                return @"suckEffect";  // 吮吸
                break;
            case CATransitionTypeOglFlip:
                return @"oglFlip";  // 翻转
                break;
            case CATransitionTypeRippleEffect:
                return @"rippleEffect";   // 波纹
                break;
            case CATransitionTypePageCurl:
                return @"pageCurl";  // 翻页
                break;
            case CATransitionTypePageUnCurl:
                return @"pageUnCurl";  // 反翻页
                break;
            case CATransitionTypeCameraIrisHollowOpen:
                return @"cameraIrisHollowOpen";  // 开镜头
                break;
            case CATransitionTypeCameraIrisHollowClose:
                return @"cameraIrisHollowClose";   // 关镜头
                break;
         default:
                return @"";
                break;
        }
    }
    NSString *getCATransitionSubType(CATransitionSubType subType) {
        switch (subType) {
            case CATransitionSubTypeFromRight:
                return kCATransitionFromRight;
                break;
            case CATransitionSubTypeFromLeft:
                return kCATransitionFromLeft;
                break;
            case CATransitionSubTypeFromTop:
                return kCATransitionFromTop;
                break;
            case CATransitionSubTypeFromBottom:
                return kCATransitionFromBottom;
                break;           
            default:
                return @"";
                break;
        }
    }
    
    // 实现自己添加的 带动画的 push控制器的方法
    // 动画参数传 系统所需的字符串
    - (void)pushViewController:(UIViewController *)viewController withCATransitionTypeString:(NSString *)typeString subTypeString:(NSString *)subTypeString animated:(BOOL)animated
    {
        CATransition *transition = [CATransition animation];
        transition.duration = kTransitionDuration;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = typeString;
        transition.subtype = subTypeString;
        
        [self.view.layer addAnimation:transition forKey:@"animation"];
    
       // 添加好动画后 调用系统的push方法  建议animated:后面的参数传NO---都已经用自己添加的转场动画了, 系统本身的push动画方法可以干掉它
        [self pushViewController:viewController animated:animated];
        
    }
    
    // 动画参数传 枚举  利用自己写的两个函数 映射为系统所需的字符串参数, 再调用上面的方法
    // 建议调用此方法 --- 枚举 有提示  谁不喜欢呢???
    - (void)pushViewController:(UIViewController *)viewController withCATransitionType:(CATransitionType)type subType:(CATransitionSubType)subType animated:(BOOL)animated
    {
        NSString *typeString = getCATransitionTypeStringWithCATransitionType(type);
        NSString *subTypeString = getCATransitionSubType(subType);
        
        [self pushViewController:viewController withCATransitionTypeString:typeString subTypeString:subTypeString animated:animated];
    }
    
    
    // pop思路同上
    // 实现自己添加的 带动画的 pop控制器的方法
    - (void)popViewControllerWithCATransitionTypeString:(NSString *)typeString subTypeString:(NSString *)subTypeString animated:(BOOL)animated
    {
        CATransition *transition = [CATransition animation];
        transition.duration = kTransitionDuration;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = typeString;
        transition.subtype = subTypeString;
        
        [self.view.layer addAnimation:transition forKey:@"animation"];
          
      // 添加好动画后 调用系统的pop方法  建议animated:后面的参数传NO---都已经用自己添加的转场动画了, 系统本身的pop动画方法可以干掉它
        [self popViewControllerAnimated:animated];
    }
    
    - (void)popViewControllerWithCATransitionType:(CATransitionType)type subType:(CATransitionSubType)subType animated:(BOOL)animated
    {
        NSString *typeString = getCATransitionTypeStringWithCATransitionType(type);
        NSString *subTypeString = getCATransitionSubType(subType);
        
        [self popViewControllerWithCATransitionTypeString:typeString subTypeString:subTypeString animated:animated];
    }
    
    

    把这个分类拖到项目中, 自此, 只要想用自定义的转场动画 做项目中的push控制器的动画 只要调用分类中的

    // 传枚举(建议)
    // push
    - (void)pushViewController:(UIViewController *)viewController withCATransitionType:(CATransitionType)type subType:(CATransitionSubType)subType animated:(BOOL)animated;
    // pop
    - (void)popViewControllerWithCATransitionType:(CATransitionType)type subType:(CATransitionSubType)subType animated:(BOOL)animated;
    
    // 传字符串
    // push
    - (void)pushViewController:(UIViewController *)viewController withCATransitionTypeString:(NSString *)typeString subTypeString:(NSString *)subTypeString animated:(BOOL)animated;
    // pop
    - (void)popViewControllerWithCATransitionTypeString:(NSString *)typeString subTypeString:(NSString *)subTypeString animated:(BOOL)animated;
    

    这几个方法即可...

    iOS开发的小伙伴们可以看下本人写的其他iOS控件哟

    相关文章

      网友评论

          本文标题:CATransition-给push控制器添加丰富的动画效果

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