http://blog.csdn.net/wmqi10/article/details/16850479
iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势。支持此手势的是UINavigationController中新增的属性
interactivePopGestureRecognizer,即右滑返回只支持以UINavigationController为容器的ViewController间切换,要想在自定义容器中使用,需要一些额外的工作。
基本地,控制ViewController是否启用右滑返回,只需要这样:
1 self.navigationController.interactivePopGestureRecognizer.enabled = YES;
默认情况下enabled为YES。
在实际使用中,遇到了一些问题,整理如下:
1、自定义返回按钮后,右滑返回失效;
解决方案:比较直观的办法是在自定义返回按钮时,使用backBarButtonItem:
1 UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; 2 //some initialize code here... 3 UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 4 self.navigationItem.leftBarButtonItem = barItem; //not working 5 self.navigationItem.backBarButtonItem = barItem; //serve well
P.S:关于backBarButtonItem和leftBarButtonItem的区别:
http://www.cocoachina.com/ask/questions/show/97110
但这样无法支持左上角多个按钮的情况。考虑到 interactivePopGestureRecognizer也有delegate属性, 替换默认的 self . navigationController .interactivePopGestureRecognizer.delegate来配置右滑返回的表现也是可行的。在主ViewController中:
1 self.navigationController.interactivePopGestureRecognizer.delegate = self;
1 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 2 { 3 if (self.navigationController.viewControllers.count == 1)//关闭主界面的右滑返回 4 { 5 return NO; 6 } 7 else 8 { 9 return YES; 10 } 11 }
如此做的好处是可以在主ViewController中配置栈中所有ViewController右滑返回的开启,而不需要在各个ViewController中分别设置enabled。
值得注意的是:在替换了delegate之后,必须在gestureRecognizerShouldBegin:中设置某ViewController A开启右滑返回,同时在A中未设置interactivePopGestureRecognizer.enabled = NO,右滑返回才会开启,即二者中任一为NO,右滑返回都处于关闭状态。
2、主界面(UINavigationController栈中的第一个ViewController)默认也是开启右滑返回的。若在主界面上右滑,不会有动作执行。但此时想进入下一级ViewController(如点击tableView中某一行),切换动画却没有出现。切回桌面再进入应用,发现直接进入了下一级ViewController。
解决方案:这个问题是在最初试验右滑返回的使用方式时出现的。在使用自定义返回按钮的ViewController中
1 self.navigationController.interactivePopGestureRecognizer.delegate = self;
解决解决问题1的同时,造成了问题2。和1中相似,都是在替换了默认的delegate之后,interactivePopGestureRecognizer就能调用自定义的返回方法了。具体原因尚不清楚,待更新【Mark】。
3、在使用右滑返回拖动到一半时,有时会在导航栏上看到三个排成一行的小蓝点。
解决方案:原因不明,解决方案不明。
P.S:在一个帖子上看到一个办法:
1 self.navigationItem.title = @"";
可以隐藏小蓝点,但由于小蓝点非必现,在不明究竟的情况下很难说是否有效。
帖子链接: http://www.tuicool.com/articles/FB3IJ3
(1)在工程中查看, self . navigationController .interactivePopGestureRecognizer.delegate实际上是一个
_UINavigationInteractiveTransition实例,该类声明如下:
1 @class UIScreenEdgePanGestureRecognizer; 2 3 @interface _UINavigationInteractiveTransition : _UINavigationInteractiveTransitionBase { 4 UIScreenEdgePanGestureRecognizer *_edgePanRecognizer; 5 } 6 7 @property(readonly) UIScreenEdgePanGestureRecognizer * screenEdgePanGestureRecognizer; 8 9 - (void)_configureNavigationGesture; 10 - (BOOL)_gestureRecognizer:(id)arg1 shouldBeRequiredToFailByGestureRecognizer:(id)arg2; 11 - (void)dealloc; 12 - (BOOL)gestureRecognizer:(id)arg1 shouldReceiveTouch:(id)arg2; 13 - (BOOL)gestureRecognizer:(id)arg1 shouldRecognizeSimultaneouslyWithGestureRecognizer:(id)arg2; 14 - (BOOL)gestureRecognizerShouldBegin:(id)arg1; 15 - (id)gestureRecognizerView; 16 - (id)initWithViewController:(id)arg1 animator:(id)arg2; 17 - (id)screenEdgePanGestureRecognizer; 18 - (void)setNotInteractiveTransition; 19 - (void)startInteractiveTransition; 20 21 @end
可以看到,委托的内部,实际上是一个UIScreenEdgePanGestureRecognizer实例在起作用,它是iOS7中引入的一个新类,用于支持某些情况下ViewController间切换的初始化。apple官方文档中对其的描述很少,如下:
A UIScreenEdgePanGestureRecognizer
looks for panning (dragging) gestures that start near an edge of the screen. The system uses screen edge gestures in some cases to initiate view controller transitions. You can use this class to replicate the same gesture behavior for your own actions.
After creating a screen edge pan gesture recognizer, assign an appropriate value to the edges
property before attaching the gesture recognizer to your view. You use this property to specify from which edges the gesture may start. This gesture recognizer ignores any touches beyond the first touch.
要在自定义的ViewController容器中支持右滑返回,可能就需要用到它。
(2)目前不少应用还是用的iOS 6.1 SDK,而许多iOS7的用户对右滑返回的需求非常迫切,因此在iOS 6.1SDK下模拟右滑返回在短时间内是有必要的,以下是一个通过在push时截取上级ViewController界面为UIImage作为下一级ViewController的背景的一种实现方式:
作者的本意似乎并不要要模拟右滑返回,但稍作修改就能在结构比较简单的应用中使用,以下是链接:
https://github.com/vinqon/MultiLayerNavigation
P.S:对于一些特殊的需求,如在有ScrollView的界面上(比如浏览照片)模拟右滑返回,当滑动到最左边时即执行右滑返回,该类无法满足,待处理【Mark】。
1、UIScreenEdgePanGestureRecognizer Class Reference
2、_UINavigationInteractiveTransition.h
3、自定义返回按钮时,iOS7手势返回遇到的问题
相关推荐
IOS页面滑动返回 MLNavigationController导航栏使用这个即可
使用方法:YRTransition文件夹下面的所有类导入你的工程,在使用的时候导入#import "YRTransitionKit.h",具体操作查看Dome。 代码说明:代码不是我自己写的,但是也花了比较多的时间,象征性的收取3积分,你可以在...
滑动返回
IOS7 UINavigationController滑动Demo,解决了在push后的页面可以滑动返回的问题。
支持oc和Swift:京东,腾讯体育等等都是这种效果 git:https://github.com/Bonway/BBGestureBack 说明文档:https://blog.csdn.net/bonway_huang/article/details/50505975
WKWebView 0代码全屏滑动返回 WKWebView 0代码全屏滑动返回 WKWebView 0代码全屏滑动返回
手势返回,ios7上貌似已经自带了这个功能;oc及swift代码
几行代码实现iOS7的滑动返回。
1.系统自带的NavigationBar 实现的自定义导航栏 2. TabBarController 中嵌套 TabBarController 3. 手势滑动返回
解决scrollow和地图与侧滑返回不兼容的问题,直接使用调用,特别方便!
全屏滑动返回,在很多应用中都使用到,比如说天猫,京东那种滑动返回的效果,本人做了一个类似的,原理很简单就是,利用截屏功能。 使用方法 继承并用CJNavigationController创建NavigationController 注意...
让activity具有滑动返回的效果 类似于ios的返回方式。
BBGestureBack不仅支持OC还支持Swift,iOS主流的全屏手势返回、滑动返回、pop动画效果都有,适配各种iPhone,嵌入简单,只需按照Demo集成,就能完美使用。(集成最简单、功能最全面)
主要介绍了iOS 自定义返回按钮,保留系统滑动返回功能,实现方法非常简单,具有参考借鉴价值,需要的朋友参考下吧
在ios7以后,苹果推出了手势滑动返回功能,也就是从屏幕左侧向右滑动可依返回上一个界面。这项功能在大多数情况下方便了用户的使用,但是有时候,我们并不需要手势返回功能,比如某个页面加入了左右滑动翻页功能,...
###拦截iOS7 滑动返回手势###效果图见iOS7 系统自带原生手势滑动返回,但是控制区域在左侧10px位置,本demo支持viewController全部区域###github地址###主要功能模拟iOS手势滑动返回效果只支持iOS7 及以上版本此方法...
主要为大家详细介绍了iOS禁用右滑返回的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
详情请看:https://github.com/Bonway/BBGestureBack
SwipetoFinishActivity, 像iOS的UINavigationController那样可以对Activity进行滑动返回操作
有着类似iOS打开和关闭界面,底层Activity会跟随滑动的滑动返回控件