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

利用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控件哟

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容