iOS7滑动返回

本文转载至 http://www.cnblogs.com/lexingyu/p/3432444.html

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官方文档中对其的描述很少,如下:

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的背景的一种实现方式:

今天看到了作者的一篇说明帖,深感之前的思考太过肤浅,此处将iOS6下滑动返回的实现独立出来:

http://www.cnblogs.com/lexingyu/p/3434340.html

【参考】

1、UIScreenEdgePanGestureRecognizer Class Reference

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScreenEdgePanGestureRecognizer_class/Reference/Reference.html#//apple_ref/occ/cl/UIScreenEdgePanGestureRecognizer

2、_UINavigationInteractiveTransition.h

https://github.com/nst/iOS-Runtime-Headers/blob/master/Frameworks/UIKit.framework/_UINavigationInteractiveTransition.h

3、自定义返回按钮时,iOS7手势返回遇到的问题

http://www.tuicool.com/articles/FB3IJ3

时间: 2024-10-01 06:31:12

iOS7滑动返回的相关文章

iOS7 滑动返回相关总结

//为了隐藏默认的返回按钮 self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:[UIView new]]; //开启手势操作 self.navigationController.interactivePopGestureRecognizer.delegate = nil;

iOS7下滑动返回与ScrollView共存二三事

[转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用,可以替换interactivePopGestureRecognizer的delegate以统一管理应用中所有页面滑动返回的开关,比如在UINavigationController的派生类中 1 //我是一个NavigationController的派生类 2 - (id)initWithRootV

ios7去除手势滑动返回

if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } ios7去除手势滑动返回

滑动返回功能被覆盖的解决思路

在OC开发中,导航控制器是一个非常常见的控件,而且在不少使用时候,我们需要自定义导航条NavigationBar.但是这个做法可能带来一些小麻烦,下面是我遇到的问题以及解决方案的思维过程. 在苹果内部,返回功能的实现自带了一个边缘的滑动返回功能.但是一旦使用我们自定义的NavigationBar,子控制器这个功能便会消失.如果我们既要用到自定义,又要保留滑动返回功能,那我们首先要分析消失的原因,再来寻找解决方案. 既然替换NavigationBar会导致滑动返回功能的消失,那我们基本可以确定,在

iOS之手势滑动返回功能-b

iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的,那么你需要自定义UINavigationBar,但当你自定义navigationBar后,这个功能就会自动失效. 屏蔽右滑返回功能代码:   if ([self.navigationController respondsToSelector:@selector(interactivePopGest

一个丝滑的全屏滑动返回手势

一个丝滑的全屏滑动返回手势 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的返回按钮的方式返回了,因为这对单手操作十分不友好:如果一个 App 居然胆敢不支持滑动返回,那离被卸载就不远了. 说到全屏返回手势,首先我感觉这件事本身可能就有问题,毕竟有点反苹果官方的交互,让用户从任意的地方都能够滑 动返回这个交互在国

IOS 自定义 滑动返回 手势

/** 只需要在你自定义的导航控制器中,改成如下代码即可,自定义手势返回 */ #define KEY_WINDOW [[UIApplication sharedApplication] keyWindow] #define kScreenW KEY_WINDOW.bounds.size.width #define kAnimateDuration 0.3 #define kDefaultAlapa 0.5 #define kDefaultScale 0.95 #define iOS7 ([UI

UINavigationController滑动返回

最近做了UINavigationController的滑动返回(IOS7及以后系统默认支持的), 主要分成以下几步以及碰到的问题, 我这里做个总结: *.首先说明个普遍碰到的问题 网上普遍看到说, 在UINavigationController下自定义leftBarButtonItem会导致滑动失效, 解决方案:http://blog.csdn.net/meegomeego/article/details/25879605 但我想告诉大家, 我也是自定义了leftBarButtonItem却没有

iOS 一个丝滑的全屏滑动返回手势

原文链接:http://blog.sunnyxx.com/2015/06/07/fullscreen-pop-gesture/ 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支持,再配合上 UINavigationController 的交互式动画,pop 到上一级页面的操作变的非常顺畅和丝滑,从此,我很少再使用点击左上角导航栏上的返回按钮的方式返回了,因为这对单手操作十分不友好:如果一个 App 居然胆敢不支持滑动返回,那离被卸载就不远了. 说到全屏返回手势,首先我