UINavgationController加左滑动画 ----- 初探转场动画

楔子

最近项目里遇到一个需求是往导航栏加一个左滑效果实现相似如图的功能。就想到了UINavgationController的转场动画。以前一看总以为好麻烦还要先实现个协议后来仔细一看就以为很简单了。小白帖

转场动画类

网上有一个UINavgationController+FDFullscreenPopGesture 的分类实现了 UIViewController 能够在任意方向右滑返回到上移界面。他找个是利用Runtime交换了原生的 pushview 方法,而后自定义手势代理等。 我要说的今天找个也是添加了一个手势而后自定义了转场动画其中主要用到了一下几个类:bash

UIPanGestureRecognizer

为UINavgationController 添加侧滑手势动画

UINavigationControllerDelegate

须要实现这两个代理而后得到者俩对象spa

-(id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController**<br>

-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC 
复制代码

UIViewControllerInteractiveTransitioning

动画执行的状态能够设置取消 成功 progress3d

UIViewControllerAnimatedTransitioning

这个类是UIViewController转场动画实现的必须的几个协议. 他有一下几个方法分别是
- (NSTimeInterval)transitionDuration:(nullable id )transitionContext; 返回动画实现时间戳代理

- (void)animateTransition:(id )transitionContext; 动画实现上下文动画主要是在这里实现的。code

- (id ) interruptibleAnimatorForTransition:(id )transitionContext; 这个方法返回一个执行动画的对象把 UIView animation 那个方法对象化了。可选实现cdn

- (void)animationEnded:(BOOL) transitionCompleted;对象

实现思路

1. 添加右滑手势

得到当前手势所在的UIView偏移的位置 若是 当前点小于0 则判断为右滑。 UINavgationControllerDelegate 须要在专场动画将要执行的时候进行设置 并在手势结束后置为nil,不然可能形成手势冲突,将interactivePopTransition设置为0,得到progress即使宜的进度,根据动画效果来,本动画实现右滑效果,因此当前手势所在点占屏幕百分比就是当前progress。blog

2. 设置动画执行过程

我写了一个其余类来实现该动画首先得到 fromeviewcontroller,toviewcontroller,containerView 和 context,animation

而后设置动画执行: 下面这段比较 烧脑,反正对于我来讲我差很少想了半小时才想上来

注意着几个数是怎么得来的下面我经过一副图理解。

根据动画执行的进度来达到匹配效果其实 toview 是偏移了 0.6个屏幕宽度 而 fromview偏移了1个屏幕宽度

总结

有些事情其实没本身想的那么难

相关文章
相关标签/搜索