1.转场动画的入口|方式
2.转场动画对象介绍
3.转场动画的类型
转场动画的入口|方式
页面的切换一般有三种方式:
Navigation controller 推入和推出页面
Tab bar controller 选择的改变
Modal 页面的展示和消失
则对应的我们可以在控制器遵循相应的协议,实现该方法,告诉系统是否需要自定义转场动画以及转场动画的实现效果.自定义push/pop动画要遵守UINavigationControllerDelegate协议
自定义tabbarController转场动画要遵守UITabBarControllerDelegate协议
自定义present/dismiss动画要遵守UIViewControllerTransitioningDelegate协议
UINavigationControllerDelegate
//返回可交互的动画效果,若使用了自定义转场效果系统会调用该方法,实现该方法来自定义交互动画,返回nil,使用系统內置
- (nullable id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController
interactionControllerForAnimationController:(id <UIViewControllerAnimatedTransitioning>) animationController NS_AVAILABLE_IOS(7_0);
//当进行控制器push,pop的时候,系统会调用该方法,若返回nil,则使用系统內建的动画效果,一般在该方法返回我们自定义实现的UIViewControllerAnimatedTransitioning类
- (nullable id <UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC
fromViewController表示当前视图容器,toViewController表示要跳转到的视图容器。如果是从A视图控制器present到B,则A是from,B是to。从B视图控制器dismiss到A时,B变成了from,A是to。
UIViewControllerTransitioningDelegate
//返回一个管理prenent动画控制器
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source;
//返回一个管理pop动画控制器
- (nullable id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed;
//返回一个管理prenent手势过渡的交互控制器
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForPresentation:(id <UIViewControllerAnimatedTransitioning>)animator;
//返回一个管理pop动画过渡的交互控制器
- (nullable id <UIViewControllerInteractiveTransitioning>)interactionControllerForDismissal:(id <UIViewControllerAnimatedTransitioning>)animator;
Presented和Presenting这也是一组相对的概念,它容易与fromView和toView混淆。简单来说,它不受present或dismiss的影响,如果是从A视图控制器present到B,那么A总是B的presentingViewController, B总是A的presentedViewController。
UITabBarControllerDelegate
- (nullable id <UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController
interactionControllerForAnimationController: (id <UIViewControllerAnimatedTransitioning>)animationController NS_AVAILABLE_IOS(7_0);
- (nullable id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
animationControllerForTransitionFromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC NS_AVAILABLE_IOS(7_0);
转场动画对象介绍
相关术语
- 动画控制器(Animation Controllers) 遵从 UIViewControllerAnimatedTransitioning 协议,并且负责实际执行动画。
- 交互控制器(Interaction Controllers) 通过遵从 UIViewControllerInteractiveTransitioning 协议来控制可交互式的转场。
- 转场代理(Transitioning Delegates) 根据不同的转场类型方便的提供需要的动画控制器和交互控制器。
- 转场上下文(Transitioning Contexts) 定义了转场时需要的元数据,比如在转场过程中所参与的视图控制器和视图的相关属性。 转场上下文对象遵从 UIViewControllerContextTransitioning 协议,并且这是由系统负责生成和提供的。
- 转场协调器(Transition Coordinators) 可以在运行转场动画时,并行的运行其他动画。 转场协调器遵从 UIViewControllerTransitionCoordinator 协议。
UIViewControllerContextTransitioning
提供切换上下文给开发者使用,包含了从哪个VC到哪个VC等各类信息,一般不需要开发者自己实现。
最重要的方法有:
-(UIView *)containerView; VC切换所发生的view容器,开发者应该将切出的view移除,将切入的view加入到该view容器中。
-(UIViewController *)viewControllerForKey:(NSString *)key; 提供一个key,返回对应的VC.UITransitionContextFromViewControllerKey和UITransitionContextToViewControllerKey两种,分别表示将要切出和切入的VC。
-(CGRect)initialFrameForViewController:(UIViewController *)vc; 某个VC的初始位置,可以用来做动画的计算。
-(CGRect)finalFrameForViewController:(UIViewController *)vc; 与上面的方法对应,得到切换结束时某个VC应在的frame。
-(void)completeTransition:(BOOL)didComplete; 向这个context报告切换已经完成。
转场动画的类型
转场有非可交互式和可交互式两种方式.
非交互式
动画控制器协议负责添加视图以及执行动画,遵守UIViewControllerAnimatedTransitioning协议,共有3个协议方法,前2个为required.后一个为optional
//返回动画执行的时间
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext;
//最核心方法 执行动画的地方
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext;
//转场动画结束后调用,执行一些收尾工作
- (void)animationEnded:(BOOL) transitionCompleted;
交互式
UIViewControllerInteractiveTransitioning,交互式通过交互(比如手势或重力感应等等,来驱动整个转场进程)动态的显示动画效果,转场代理提供交互控制器(一般使用UIPercentDrivenInteractiveTransition来更简单的实现手势交互动画),另外交互控制器必须有动画控制器才能工作。UIPercentDrivenInteractiveTransition遵守UIViewControllerInteractiveTransitioning协议的一个对象,做为交互控制器。交互过程是由转场对象上下文管理控制的,用下面三个方法控制转场进度的.
//更新转场进度 进度值0.f-1.0f 更新百分比,一般通过手势识别的长度之类的来计算一个值,然后进行更新。
- (void)updateInteractiveTransition:(CGFloat)percentComplete
//取消转场,转场动画从当前状态返回至转场发生前的状态
- (void)cancelInteractiveTransition;
//完成转场,转场动画从当前状态继续直到结束 更新到切换后的状态
- (void)finishInteractiveTransition;
当然你可以为了实现交互式切换的功能,实现这个接口.
备注
转场动画
VCTransitionsLibrary
模态弹出上页面部分间隙
Swift
OC 转场动画合集
OC 转场动画合集
图片放大 适合详情页头部显示图片的效果
Hero
IBAnimatable
按钮点击模态效果
主流转场动画
参考