VCTransitionsLibrary –自定义iOS交互式转场动画的库
简介
VCTransitionsLibrary 提供了许多适用于入栈,出栈,模态等场景下控制器切换时的转场动画.它本身提供了一个定义好的转场动画库,你可以拖到自己工程中直接使用;也提供了许多拥有不同转场动画效果”互动控制器”,你可以直接使用这些控制器来和自定义动画效果配合使用;而不是自己控制去控制交互.
项目主页: VCTransitionsLibrary
最新示例: 点击下载
注意: 自定义视图控制器的转场动画为iOS7 + 通过 UIViewControllerTransitioningDelegate协议, UINavigationControllerDelegate协议和 UITabBarControllerDelegate 协议提供的系统级别的支持.这个库的意义在于定义了常用的动画效果,并封装了常用的交互操作,简化了iOS交互式转场动画的编码量!
快速入门
运行环境
- iOS 7+
- ARC
安装
使用 CocoaPods 安装
- pod "VCTransitionsLibrary"
手动安装
把文件 AnimationControllers
和 InteractionControllers 文件夹下所有代码复制
到工程中即可.
使用
在自定义转场动画时,有两类关键的类:
- 动画控制器 – 这个类是用来实现自定义动画的.但你声明想要使用自定义动画时,你应该提供一个动画控制器.这个类会实现需要的动画,完成时会通知框架.
- 交互控制器 – 这个类是用来管理交互的-那些通常由某个手势空控制的交互,允许用户通过滑动,轻扫或执行其他操作来实现两个视图控制器的导航.必须指出的是,交互控制器允许导航取消,例如,一个用户可以在正在导航至某一页面时,突然改变主意,然后取消了操作.
注意: 动画和交互是完全独立的,这意味着你可以在其他任何自定义控制器上独立使用交互控制器-很酷!
使用动画控制器
AnimationControllers 文件夹中提供了许多可以整合进你的工程中的动画控制器:
自定义模态控制器显示/隐藏的动画
UIViewControllerTransitioningDelegate 协议被用来在模态控制器显示/隐藏时提供一个动画控制器.当一个视图控制器被模态显示或隐藏时,它的transitioningDelegate属性用来提供UIViewControllerTransitioningDelegate协议的支持.担当代理角色的类,通过 animationControllerForPresentedController: presentingController: sourceController: 方法返回模态显示时的动画, 通过 animationControllerForDismissedController: 返回模态消失时的动画即可.
自定义顶部导航的转场动画
UINavigationController 有一个
id<UINavigationControllerDelegate> delegate 属性.只需要让它的代理通过 navigationController: animationControllerForOperation: fromViewController: toViewController: 返回某个动画效果即可.
为了同时设置出栈/入栈都合适的动画效果(或者说,出栈/入栈时能使用相反方向的动画),你可以参考下面代码:
- - (id<UIViewControllerAnimatedTransitioning>)navigationController:
- (UINavigationController *)navigationController
- animationControllerForOperation:(UINavigationControllerOperation)operation
- fromViewController:(UIViewController *)fromVC
- toViewController:(UIViewController *)toVC {
- // 出栈时,要反转动画方向.
- _animationController.reverse = operation == UINavigationControllerOperationPop;
- return _animationController;
- }
自定义底部标签栏导航的转场动画
UITabBarController 有一个 id<UITabBarControllerDelegate> delegate属性,只需要让它的代理通过tabBarController: animationControllerForTransitionFromViewController: toViewController:返回某个动画效果即可.
为了给动画一个合适的方向,你可以比较两个视图控制器的索引:
- - (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
- animationControllerForTransitionFromViewController:(UIViewController *)fromVC
- toViewController:(UIViewController *)toVC {
- NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];
- NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];
- _animationController.reverse = fromVCIndex < toVCIndex;
- return _animationController;
- }
使用交互控制器
交互控制器和动画控制器配合使用,可以实现交互式的动画转场效果,比如可以让用户通过手势来控制页面间的导航.交互控制器允许用户在一个转场动画中前进,后退,甚至退出.
交互控制器负责给视图添加手势,并负责在用户使用某个手势时进行相应地导航操作.
模态控制器消失时的交互
UIViewControllerTransitioningDelegate 协议,也用来提供对交互式转场的支持.下面是一个结合清扫手势和翻页动画的例子:
- //实例变量,通常在你的初始化方法初始化它们
- CEFlipAnimationController *_animationController;
- CESwipeInteractionController *_interactionController;
- - (id<UIViewControllerAnimatedTransitioning>)
- animationControllerForPresentedController:(UIViewController *)presented
- presentingController:(UIViewController *)presenting
- sourceController:(UIViewController *)source {
- // 允许交互控制器绑定它的手势识别器.
- [_interactionController wireToViewController:presented
- forOperation:CEInteractionOperationDismiss];
- _animationController.reverse = NO;
- return _animationController;
- }
- - (id<UIViewControllerAnimatedTransitioning>)
- animationControllerForDismissedController:(UIViewController *)dismissed {
- _animationController.reverse = YES;
- return _animationController;
- }
- - (id<UIViewControllerInteractiveTransitioning>)
- interactionControllerForDismissal:
- (id<UIViewControllerAnimatedTransitioning>)animator {
- // 如果有交互控制器被触发了,就直接使用它.返回nil,是为了支持用户通过点击某个按钮直接返回;此时不会触发交互控制器.
- return _interactionController.interactionInProgress
- ? _interactionController : nil;
- }
出栈时的交互
UINavigationControllerDelegate 也有方法为交互式转场提供支持.一个典型的类似于上上面代码的模式:
- // 实例变量,通常在你的初始化方法中初始化它们.
- CEFlipAnimationController *_animationController;
- CESwipeInteractionController *_interactionController;
- - (id<UIViewControllerAnimatedTransitioning>)
- navigationController:(UINavigationController *)navigationController
- animationControllerForOperation:(UINavigationControllerOperation)operation
- fromViewController:(UIViewController *)fromVC
- toViewController:(UIViewController *)toVC {
- // 把交互控制器绑定到你的视图控制器上.
- [_interactionController wireToViewController:toVC
- forOperation:CEInteractionOperationPop];
- _animationController.reverse = operation == UINavigationControllerOperationPop;
- return _animationController;
- }
- - (id <UIViewControllerInteractiveTransitioning>)
- navigationController:(UINavigationController *)navigationController
- interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>)animationController {
- //如果有交互控制器被触发了,就直接使用它.返回nil,是为了支持用户通过点击某个按钮直接返回;此时不会触发交互控制器.
- return _interactionController.interactionInProgress
- ? _interactionController : nil;
- }
用于标签栏控制器切换时的交互
UITabBarControllerDelegate 协议也为交互式转场提供了支持.但是由于代理方法在首次初始化时不被执行,所有需要其他方式来绑定交互控制器,如KVO:
- @implementation TabBarViewController {
- CEFoldAnimationController *_animationController;
- CESwipeInteractionController *_swipeInteractionController;
- }
- - (id)initWithCoder:(NSCoder *)aDecoder {
- if (self = [super initWithCoder:aDecoder]) {
- self.delegate = self;
- // 创建交互/动画控制器.
- _swipeInteractionController = [CESwipeInteractionController new];
- _animationController = [CEFoldAnimationController new];
- _animationController.folds = 3;
- // 使用观察者模式监测被选中的选择器的变化情况.
- [self addObserver:self
- forKeyPath:@"selectedViewController"
- options:NSKeyValueObservingOptionNew
- context:nil];
- }
- return self;
- }
- - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
- change:(NSDictionary *)change
- context:(void *)context
- {
- if ([keyPath isEqualToString:@"selectedViewController"] )
- {
- // 把交互控制器绑定到视图控制器上.
- [_swipeInteractionController wireToViewController:self.selectedViewController
- forOperation:CEInteractionOperationTab];
- }
- }
- - (id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
- animationControllerForTransitionFromViewController:(UIViewController *)fromVC
- toViewController:(UIViewController *)toVC {
- NSUInteger fromVCIndex = [tabBarController.viewControllers indexOfObject:fromVC];
- NSUInteger toVCIndex = [tabBarController.viewControllers indexOfObject:toVC];
- _animationController.reverse = fromVCIndex < toVCIndex;
- return _animationController;
- }
- -(id<UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController
- {
- return _swipeInteractionController.interactionInProgress ? _swipeInteractionController : nil;
- }
- @end
VCTransitionsLibrary –自定义iOS交互式转场动画的库的更多相关文章
- iOS商城demo、音乐播放器、视频通话、自定义搜索、转场动画等源码
iOS精选源码 微信自定义搜索框实现 一个商城Demo,持续更新中 在Object-C中学习数据结构与算法之排序算法 iOS 音乐播放器之锁屏歌词+歌词解析+锁屏效果 XLsn0wPushTimePi ...
- iOS 开发--转场动画
"用过格瓦拉电影,或者其他app可能都知道,一种点击按钮用放大效果实现转场的动画现在很流行,效果大致如下:" 本文主讲SWIFT版,OC版在后面会留下Demo下载 在iOS中,在同 ...
- ios图层转场动画
动画类型 CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点 UINavigationController就是通过CA ...
- iOS | CAShapeLayer转场动画
什么也不说了,作为一名乐于分享技术的小开发,直接先上个样式最为直观贴切,有需要的朋友可以直接拿过去用. 需要demo请点击这里 :github 在这个demo中,核心为选用画布CAShapeLayer ...
- iOS之UI--转场动画
1.什么是转场动画? 就是从一个场景转换到另一个场景,像导航控制器的push效果,就是一个转场. 2.如何创建转场动画 创建转场动画 CATransition *anim = ...
- iOS之转场动画
CodeApp地址CATransition_Demo:https://github.com/Wheat-Qin/CATransition_Demo iOS中比较全的翻转过渡动画(不只是苹果提供的).包 ...
- iOS:iOS开发非常全的三方库、插件等等
iOS开发非常全的三方库.插件等等 github排名:https://github.com/trending, github搜索:https://github.com/search. 此文章转自git ...
- iOS的非常全的三方库,插件,大牛博客
转自: http://www.cnblogs.com/zyjzyj/p/6015625.html github排名:https://github.com/trending, github搜索:http ...
- iOS开发 非常全的三方库、插件、大牛博客等等
UI 下拉刷新 EGOTableViewPullRefresh- 最早的下拉刷新控件. SVPullToRefresh- 下拉刷新控件. MJRefresh- 仅需一行代码就可以为UITableVie ...
随机推荐
- input类型为file改变默认按钮样式
改变 input file 样式(input 文件域)是很多前端朋友经常遇到的头疼问题,今天推荐两种改变 input file 样式的两种常用方法: 方法一: <input type=&quo ...
- [转]jQuery的.live()和.die()
本文转自:http://www.cnblogs.com/dumuqiao/archive/2011/09/09/2172513.html 翻译原文地址:http://www.alfajango.com ...
- Unity3D跨平台动态库编译---记kcp基于CMake的各平台构建实践
一 为什么需要动态库 1)提供原生代码(native code)的支持,也叫原生插件,但是我实践的是c/cpp跨平台动态库,这里不具体涉及安卓平台java库和ios平台的objectc库构建. 2)某 ...
- 文本框只允许输入数字.net/javascript
<input type="text" name="test" onKeyUp="test1.value=(this.value=this.val ...
- http method and status code
http method HEAD: 只返回相应的header POST: 一般用于提交表单 PUT: 向Web服务器上传文件 GET: 查 DELET: 删除 status code 1xx与2xx: ...
- Linux kernel rbtree
Linux kernel rbtree 因编写内核模块时需要用到rbtree来记录异步request,研究分析了一下kernel rbtree的使用方法,记录于此.本文主要参考了内核文档rbtree. ...
- Java学习笔记--继承和多态(下)
1.通过继承来开发超类(superclass) 2.使用super 关键词唤起超类的构造方法 3.在超类中覆盖方法 4.区分override和overload 5.在Object类中探索toStrin ...
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别 (译)
stackOverflow中看到了很久以前问的一个关于函数声明的问题,问题对函数剖析的特别深.这里翻译了一下组织成一篇小博文,加深一下对这两种声明方式的印象.虽是老调重弹,但是只要能帮助理解问题,不管 ...
- Java基础入门 - Hello world
JDK安装完成后,将一下代码写入文件HelloWorld.java中 // HelloWorld.java public class HelloWorld { public static void m ...
- Html+CSS--->第一周初探
html css 学了一周的前端,谈谈我的感想 我一直在使用sublime text 3来编辑我的代码,其中有很多很好用的快捷键和插件大大提高了我的开发效率 在这里我极力推荐使用编辑器来进行学习前端. ...