网上有一个UINavgationController+FDFullscreenPopGesture 的分类实现了 UIViewController 能够在任意方向右滑返回到上移界面。他找个是利用Runtime交换了原生的 pushview 方法,而后自定义手势代理等。 我要说的今天找个也是添加了一个手势而后自定义了转场动画其中主要用到了一下几个类:bash
为UINavgationController 添加侧滑手势动画
须要实现这两个代理而后得到者俩对象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
复制代码
动画执行的状态能够设置取消 成功 progress,3d
这个类是UIViewController转场动画实现的必须的几个协议. 他有一下几个方法分别是
- (NSTimeInterval)transitionDuration:(nullable id )transitionContext; 返回动画实现时间戳代理
- (void)animateTransition:(id )transitionContext; 动画实现上下文动画主要是在这里实现的。code
- (id ) interruptibleAnimatorForTransition:(id )transitionContext; 这个方法返回一个执行动画的对象把 UIView animation 那个方法对象化了。可选实现cdn
- (void)animationEnded:(BOOL) transitionCompleted;对象
得到当前手势所在的UIView偏移的位置 若是 当前点小于0 则判断为右滑。 UINavgationControllerDelegate 须要在专场动画将要执行的时候进行设置 并在手势结束后置为nil,不然可能形成手势冲突,将interactivePopTransition设置为0,得到progress即使宜的进度,根据动画效果来,本动画实现右滑效果,因此当前手势所在点占屏幕百分比就是当前progress。blog
我写了一个其余类来实现该动画首先得到 fromeviewcontroller,toviewcontroller,containerView 和 context,animation
有些事情其实没本身想的那么难