iOS6下实现滑动返回
【转载请注明出处】
之前在看iOS7滑动返回时,发现了一个iOS6 SDK下的第三方实现,今天偶然间发现了作者在其博客上对该实现的一些心得,读来深觉之前的思考太过肤浅,许多实际的问题没有考虑到。帖子链接如下:
http://www.vinqon.com/codeblog/?detail/11108
工程github地址如下:
https://github.com/vinqon/MultiLayerNavigation
在帖子中作者贴出了实现代码,此处只说明一下思路和可能产生不兼容的情况,贴别人代码这么Low的行为还是算了。
代码中是通过继承UINavigationController,并在其中添加了一个UIPanGestureRecognizer实现的,大体思路如下:
1、重载pushViewController和popViewController,在push之前,截取当前界面保存为UIImage,在pop之前,移除最近保存的截图;
2、在UIPanGestureRecognizer的target中,做4件事:
(1)当手势触发时(panGestureRecognizer.state == UIGestureRecognizerStateBegan),把最近保存的截图(通常来说即上一级界面的截图,特殊情况见下文)放到当前viewController.view的下方;
(2)当手指在屏幕上移动时,相应地修改当前viewController.view.frame,使其下方的截图逐渐露出;
(3)当手势结束时(panGestureRecognizer.state ==UIGestureRecognizerStateEnded),调用重载的popViewController;
(4)当手势取消时(panGestureRecognizer.state ==UIGestureRecognizerStateEnded),将当前viewController.view.frame恢复原样。
如此就基本实现了滑动返回的手势支持,要进一步加强的,应该说有两方面:
1、效果上尽可能接近iOS7原生手势的体验:
(1)判断手势触发时的位置,只在屏幕边缘才起作用【Mark:没有找到具体的数字说明触发的范围】;
(2)手势触发时修改当前viewController.view及其所有子view的透明度;
(3)导航栏的渐变:当前界面的导航栏渐渐淡出,上一级菜单的导航栏的渐渐清晰。事实上上一级菜单的整个界面都应有一个渐渐清晰的效果,只是导航栏作为多个ViewController共享的部分,需要同时显示两种效果确实需要一定当量的脑细胞。(作者在帖子中描述了网易新闻和新浪微博各自的实现)此外,默认的导航栏中生成的左上角返回键,其文本就是上一级菜单的主标题,这种情况下“返回会渐渐变成主标题”。
2、实现中没有考虑的一些因素:
(1)setViewControllers的支持:一次性向栈中加入多个ViewController时,仅仅重载push就显得无能为力了;
(2)内存的控制:每进入一级界面都需要截取上一级界面,当层级较多时对内存的压力不小,似乎可以通过降低截取图的分辨率来达到一定的改善。将截图保存到disk上也可以,只是在快速进出时,是否会造成卡顿尚未验证。
(3)对界面中可能造成手势冲突的兼容:比如UIScrollView就内置了一个panGestureRecognizer,还有UIWebView的手势支持。
(4)当前界面可能能够造成上一级界面发生更改:比如更换主题这样的功能,以截图的方式来做的话,基本无解。
(5)截图的方式是直接截取viewController.view,没有考虑tabbar等情况,在有tabbar的情况下,下方会有一道黑边。
【参考】
1、iOS页面右滑返回交互实现方案