[iOS]任性切换自定义转场效果的XXTransition

先上Demo 效果

Demo展示

XXTransition 是什么鬼?

经历过几个公司,领导换了一波波,产品换了一波波,App的转场动画也是换了一波波,于是各种 AnimatedTransitioning、 InteractiveTransition代码也写了一波波。如果项目中用到多种转场效果,那代码目录可能是像这样的。


每个效果都分别有对应的实现了AnimatedTransitioning和InteractiveTransition逻辑的文件。

能不能简单点?方便的管理项目中用到的转场动画,方便的添加转场效果,同时也能满足各种转场效果的切换,手势交互的切换? Yes,u can ! 这正是XXTransition能帮你做到的,请为它转身。

XXTransition 为嘛来到这世上?

  • 方便添加自定义转场效果,将重心放在动画效果的实现上
  • 自由管理项目中多种转场动画,转场手势的切换,(妈妈再也不用担心恶心的需求啦)
  • 对于原使用系统转场的工程,集成后无需修改任何原代码。
  • 提供转场动画库。我会不断添加朴实无华和牛哔闪闪的转场动画在代码中,供你直接调用。这些效果,包括我自己亲手和不是亲手写的,如有雷同,别计较啦,都是分享啦,当然如果有大牛小牛给我投稿,我会很开心哒,也会在代码中注释出处哒。

XXTransition 该怎么跑起来?

安装

Github地址:https://github.com/mh4u/XXTransition/
将XXTransition目录文件拖到工程中即可

使用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 
   //启动XXTransition自定义转场
  [XXTransition startGoodJob:GoodJobTypeAll transitionDuration:0.3];

  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  [self.window makeKeyAndVisible];
  RootVC *vc = [[RootVC alloc] init];
  self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:vc];
  return YES;
}

这样一句话调用就可以开始工作啦!

Nav转场
  • 初阶
 + (void)startGoodJob:(GoodJobType)goodJobType transitionDuration:(NSTimeInterval)duration;

该方法的第一个参数是枚举值

typedef NS_OPTIONS(NSUInteger, GoodJobType) {
    GoodJobTypeNavOnly = 1 << 0,
    GoodJobTypeModalOnly = 1 << 1,
    GoodJobTypeAll = GoodJobTypeNavOnly | GoodJobTypeModalOnly
  };

可以设置只使用自定义Nav转场还是Modal转场,或者全部使用。XXTransition会在提供的转场效果中设定一个默认的Nav转场效果。如果你原先工程中使用的是系统的Nav转场效果,那恭喜你,现在不需要改其他代码就已经可以实现自定义转场了哦(使用Modal转场和Nav转场有所区别,往下看)。

如果你想换一个XXTransition提供的Nav转场,这样设置就可以啦。

//启动XXTransition自定义转场
[XXTransition startGoodJob:GoodJobTypeAll transitionDuration:0.3];
//更改全局NavTransiton效果
[XXTransition setNavTransitonKey:XXTransitionAnimationNavPage];

可是按照PM的要求,是一个全新的转场效果怎么办,得自己写啦。XXTransition可以让你专注于动画的实现,交互手势都不用care

 //添加自定义NavTransiton效果
 NSString *someNBTransitionAnimation = @“someNBTransitionAnimation";
 [XXTransition addPushAnimation:demoTransitionAnimationFragment animation:^(id<UIViewControllerContextTransitioning> transitionContext, NSTimeInterval duration) {
      //Push动画逻辑
  }];

  [XXTransition addPopAnimation:demoTransitionAnimationFragment animation:^(id<UIViewControllerContextTransitioning> transitionContext, NSTimeInterval duration) {
    //Pop动画逻辑
  }];

   //更改全局NavTransiton效果
  [XXTransition setNavTransitonKey:someNBTransitionAnimation];
  • 进阶

一般情况下,一个App只会用一种转场效果,但有讲究有追求的话,可能需要多种转场效果配合不同交互手势在不同VC互相push,pop时进行切换,简单画个图你就明白了

偶买噶

你遇到过吗,遇到了麻烦给个赞或者星,表示同病相怜,没遇到也麻烦给个星或者赞,因为我遇到了,让我感受到你的温暖。碰到这种情况,不要蓝瘦,不用香菇,看看XXTransition怎么解决。

//启动XXTransition自定义转场
[XXTransition startGoodJob:GoodJobTypeAll transitionDuration:0.3];

//更改全局NavTransiton效果
[XXTransition setNavTransitonKey:XXTransitionAnimationNavPage];

//注册特殊ViewController的NavTransiton效果和返回手势
[XXTransition registerPushViewController:[SinkVC class] forTransitonKey:XXTransitionAnimationNavSink];
[XXTransition registerPushViewController:[PageVC class] forTransitonKey:XXTransitionAnimationNavPage];
[XXTransition registerPopGestureType:XXPopGestureTypeFullScreen forViewController:[SinkVC class]];
[XXTransition registerPopGestureType:XXPopGestureTypeForbidden forViewController:[PageVC class]];

就这样,OK啦。SinkVC和PageVC分别使用响应的Nav转场效果和返回手势,而其他VC则使用全局转场效果

Modal转场

Modal切换ViewController的XXTransition使用方法和Nav有所不同,要在需要Present的使用调用UIViewController+XXTransition.h定义的方法

- (void)xx_presentViewController:(UIViewController *)viewControllerToPresent makeAnimatedTransitioning:(void (^)(XXAnimatedTransitioning *transitioning))block completion:(void (^ __nullable)(void))completion

使用如下
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
if (indexPath.row == 0) {
SinkVC *vc =[[SinkVC alloc] init];
[self.navigationController pushViewController:vc animated:YES];
} else {
ModalVC *vc = [[ModalVC alloc] init];
//XXTransition Modal转场
[self xx_presentViewController:vc makeAnimatedTransitioning:^(XXAnimatedTransitioning * _Nonnull transitioning) {
transitioning.duration = 0.5;
transitioning.animationKey = XXTransitionAnimationModalSink;
} completion:NULL];
}
}

如果你需要自己敲一个新的转场动画,类似于Nav转场中的自定义,专注动画实现,在下面两个方法中实现动画逻辑

[XXTransition addPresentAnimation:demoTransitionAnimationModalSink animation:^(id<UIViewControllerContextTransitioning> transitionContext, NSTimeInterval duration) {
 //Present 转场逻辑
}];  

[XXTransition addDismissAnimation:demoTransitionAnimationModalSink backGestureDirection:XXBackGesturePanDown animation:^(id<UIViewControllerContextTransitioning> transitionContext, NSTimeInterval duration) {
 //Dismiss 转场逻辑
}];

XXTransition 在dismiss的转场交互中,支持下面几中选择

typedef NS_ENUM(NSInteger,XXBackGesture){
  XXBackGestureNone, //禁用手势
  XXBackGesturePanLeft,
  XXBackGesturePanRight,
  XXBackGesturePanUp,
  XXBackGesturePanDown,
};
最后

如果你在使用XXTransition过程中发现任何问题,或是有任何建议,欢迎勾搭我。

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

推荐阅读更多精彩内容