`

iOS7滑动返回

阅读更多

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

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

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

分享到:
评论

相关推荐

    IOS页面滑动返回

    在iOS开发中,"页面滑动返回"是一种常见的交互方式,让用户可以通过在屏幕上向左滑动来返回上一级页面。这种功能通常是通过手势识别来实现的,为用户提供了一种直观且便捷的导航体验。在本篇文章中,我们将深入探讨...

    ios-滑动返回.zip

    在iOS应用开发中,"滑动返回"是一种常见的手势交互设计,它允许用户通过在屏幕边缘向左或向右滑动来返回上一级界面。这一功能显著提升了用户体验,因为它简化了导航过程,使得用户能够更直观、快捷地在应用的层级...

    IOS7 UINavigationController滑动Demo

    有些开发者可能需要自定义这种滑动返回的行为,例如改变滑动的灵敏度、方向,或者在某些特定场景下禁用滑动返回。 这个Demo可能包含了以下关键知识点: 1. **手势识别器(Gesture Recognizer)**:iOS中的手势识别...

    ios6手势滑动返回

    在iOS开发中,手势识别是用户体验设计的重要组成部分,特别是在iOS 6及后续版本中,手势滑动返回(Swipe to Go Back)功能极大地提升了用户在应用内的导航体验。这个功能允许用户通过在屏幕左侧边缘向右滑动来返回上...

    ios nav 滑动返回 各种动画

    使用方法:YRTransition文件夹下面的所有类导入你的工程,在使用的时候导入#import "YRTransitionKit.h",具体操作查看Dome。 代码说明:代码不是我自己写的,但是也花了比较多的时间,象征性的收取3积分,你可以在...

    iOS 解决侧滑返回各种不兼容问题

    在iOS开发中,侧滑返回(Swipe Back)是苹果提供的一种常见手势,让用户可以方便地在导航控制器的视图之间切换。然而,在某些特定场景下,如使用ScrollView或地图组件时,侧滑返回可能会与其他交互产生冲突,导致不...

    自定义导航、标签,多个TabBarController,手势滑动返回

    在iOS应用开发中,自定义导航栏(NavigationBar)和TabBarController的使用是非常常见的需求,而手势滑动返回更是提升用户体验的重要功能。以下是关于这些知识点的详细解析: 首先,我们来看自定义导航栏。系统自带...

    WKWebView 0代码全屏滑动返回

    在这个主题中,“0代码全屏滑动返回”意味着开发者希望实现一个功能,让用户在浏览WKWebView中的网页时,可以通过在屏幕边缘滑动来返回上一级页面,而无需编写额外的代码。 滑动返回是一种常见的用户界面交互设计,...

    ios-系统滑动返回.zip

    在iOS 7及更高版本中,UINavigationController已经默认支持滑动返回手势,但如果你需要自定义或者在某些特定场景下启用或禁用该功能,可以通过以下步骤进行: 1. **启用滑动返回手势**:在你的子视图控制器中,可以...

    ios-最新手势滑动返回,最新效果.zip

    7. **手势冲突处理**:在某些情况下,手势滑动返回可能会与屏幕上的其他手势识别器冲突。因此,我们需要学会如何正确配置手势识别器的代理方法,以解决这些冲突。 8. **代码组织和模块化**:良好的代码结构可以帮助...

    Android 仿iOS实现Activity滑动关闭/返回 源码

    7. 兼容其他组件:如果Activity中包含了Fragment或其他自定义组件,可能需要额外处理滑动冲突,确保滑动返回操作不会与这些组件的交互发生冲突。 通过以上步骤,你可以在Android应用中实现类似iOS的滑动返回功能,...

    iOS UIScrollView左右滑动

    在iOS开发中,`UIScrollView` 是一个至关重要的控件,它允许用户通过手势滚动查看超出视图边界的内容。本篇文章将深入探讨如何利用`UIScrollView` 实现左右滑动的效果,特别是针对`UITableView` 和 `...

    ios-滑动改变导航栏状态.zip

    在iOS开发中,导航栏(NavigationBar)是应用界面中非常重要的组成部分,通常承载着应用的标题、返回按钮以及其它操作。本项目“ios-滑动改变导航栏状态.zip”主要展示了如何通过用户滑动屏幕来动态改变导航栏的状态...

    ios-全屏滑动返回,原理很简单.zip

    全屏滑动返回,在很多应用中都使用到,比如说天猫,京东那种滑动返回的效果,本人做了一个类似的,原理很简单就是,利用截屏功能。 使用方法 继承并用CJNavigationController创建NavigationController 注意...

    仿ios边缘右侧滑动退出当前页面

    在iOS系统中,一个常见的交互设计是用户可以从屏幕边缘向右滑动来返回上一级页面,这种设计在很多Android应用中也被广泛模仿。本篇将深入探讨如何在Android平台上实现"仿ios边缘右侧滑动退出当前页面"的功能,并结合...

    IOS 左右滑动菜单

    在iOS开发中,"左右滑动菜单"是一种常见的交互设计,它允许用户通过左右滑动手势在多个视图之间切换,通常用于展示主菜单、设置或者其他功能选项。这种设计模式在许多应用程序中都能看到,例如社交应用、电商应用等...

    iOS 自定义返回按钮保留系统滑动返回功能

    在iOS开发中,自定义返回按钮并保留系统滑动返回功能是一项常见的需求。通常,当我们使用UINavigationController进行页面间的推送时,系统会自动提供一个返回按钮,并且支持用户通过左滑手势返回上一级界面。然而,...

    ios-BBGestureBack iOS 全屏手势返回 滑动返回 pop 动画效果.zip

    BBGestureBack不仅支持OC还支持Swift,iOS主流的全屏手势返回、滑动返回、pop动画效果都有,适配各种iPhone,嵌入简单,只需按照Demo集成,就能完美使用。(集成最简单、功能最全面)

    IOS 滑动手势

    在iOS开发中,滑动手势(Swipe Gestures)是一种常见的用户交互方式,它允许用户通过在屏幕上快速滑动手指来触发特定的操作。本教程将基于Xcode 6和Objective-C,详细讲解如何实现上下左右四种基本滑动手势的集成与...

    Android-有着类似iOS打开和关闭界面底层Activity会跟随滑动的滑动返回控件

    在Android应用开发中,滑动返回(Swipe Back)是一种常见的交互设计,它使得用户可以通过向左或向右滑动屏幕边缘来返回上一级界面,这种体验与iOS系统的滑动返回非常相似。标题提到的"Android-有着类似iOS打开和关闭...

Global site tag (gtag.js) - Google Analytics