手势滑动返回,多种实现方案

OC实现手势滑动控制viewCotroller 返回功能

先上效果图

Mou icon

github地址

https://github.com/kingundertree/pushBackDemo

主要功能

  1. 支持iOS5~8,滑动viewController,实现页面返回
  2. 支持背景缩放和视差平滑2种模式
  3. 支持单个页面和多个页面pop,支持页面返回后通知
  4. 单个viewController禁用手势

设计思路

  1. 继承UINavgationController,继承pushViewController方法。push的时候,依次调用[self capture],截取上一个viewController并保存
  2. UINavgationController的view上add GestureRecognizer,监听手势动作
  3. 手指右滑开始,将最新截图insertSubview: belowSubview:到当前view,并通过滑动距离,控制belowSubview的效果
  4. popViewControllerAnimated或者popToViewController: animated:后,移除对应的截图

使用方法

1.继承PushBackNavgationController

PushBackNavigationController *nav = [[PushBackNavigationController alloc] initWithRootViewController:MVC];
self.window.rootViewController = nav;

2.设置手势滑动效果,支持背景缩放和平滑

typedef enum {
    CaptureTypeWithView = 0,
    CaptureTypeWithWindow
}CaptureType; //截图区域选择

3.禁用某个页面手势

在需要控制的viewController,引入pushBackLock
[pushBackLock setDisableGestureForBack:self.navgationgationController disable:YES]
如果禁用所有手势,则不继承PushBackNavgationController即可

拦截iOS7 滑动返回手势

效果图

见iOS7 系统自带原生手势滑动返回,但是控制区域在左侧10px位置,本demo支持viewController全部区域
Mou icon

github地址

https://github.com/kingundertree/ExtensionNavGesForiOS7

主要功能

  1. 模拟iOS手势滑动返回效果
  2. 只支持iOS7 及以上版本
  3. 此方法比较简单,而且系统提供的手势滑动效果更加细腻。但是采用NSRunloop截取系统事件,使用需谨慎。

实现思路

  1. iOS7 开始,系统提供手势滑动返回功能,但是操作区域有限
  2. 设法截取系统手势事件,UINavgationController的interactivePopGestureRecognizer
  3. 自定义UIPanGestureRecognizer并add到UINavgationController的view上
  4. 截取interactivePopGestureRecognizer的target和action
  5. 把interactivePopGestureRecognizer的target和action,赋给自定义的手势上即可

使用方法

  1. 继承ExtensionNav即可

效果图

见iOS7 系统自带原生手势滑动返回,但是控制区域在左侧10px位置,本demo支持viewController全部区域
Mou icon

github地址

https://github.com/kingundertree/TransitionPopForiOS7-

主要功能

  1. 模拟iOS手势滑动返回效果
  2. 只支持iOS7 及以上版本

实现思路

  1. 设法截取系统手势事件,UINavgationController的interactivePopGestureRecognizer
  2. 通过ISO7提供的转场动画事件NavigationInteractiveTransition,创建新的action
  3. 在action中计算progress,分别实现updateInteractiveTransition、finishInteractiveTransition、cancelInteractiveTransition事件即可

使用方法

  1. 继承ExtensionNav即可

swift 语言实现手势滑动返回效果

github地址

效果同上,采用swift语言重新实现。

https://github.com/kingundertree/PushBackBySwiftDemo