iOS中“返回”操作相关
在程序中,总会设置“返回”按钮,但不可能在每一个控制器中都去设置一次“返回”按钮,那如何设置全局的“返回”按钮呢?
首先自定义一个导航控制器,在tabBarController中添加子控制器时,使用这个自定义的导航控制器,所以在这个导航控制器中重写push方法设置“返回”按钮就可以了。
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// 如果是根控制器,则不需要添加“返回”按钮
if (self.childViewControllers.count > ) {
viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem wx_itemBackWithTarget:self action:@selector(backClick)];
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
}
需要注意的是,如果自己设置了“返回”按钮,那么系统的边缘滑动返回功能就失效了,这是为什么呢?
边缘滑动返回功能失效的原因:
1>分析:边缘滑动功能属于手势操作,在UINavigationController中找到手势属性,打印输出看手势是否被清空
@property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.childViewControllers.count > ) {
viewController.navigationItem.leftBarButtonItem = [UIBarButtonItem wx_itemBackWithTarget:self action:@selector(backClick)];
viewController.hidesBottomBarWhenPushed = YES; // 输出手势
WXLog(@"%@",self.interactivePopGestureRecognizer);
}
[super pushViewController:viewController animated:animated];
}
输出结果:
-- ::39.874 caravan-alter[:] <UIScreenEdgePanGestureRecognizer: 0x7f80c9e80860; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7f80c9e53d50>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7f80c9ea1ad0>)>>
结论:手势并没有被清空,所以排除手势被清空的可能。
2>分析:手势代理做了一些事情,导致手势失效
在viewDidLoad中输入以下代码:
self.interactivePopGestureRecognizer.delegate = nil;
结论:将代理清空时,边缘滑动手势恢复,但出现的问题是,如果在根控制器继续使用边缘滑动手势操作,那么在下一次push的时候会出现程序假死的情况。将代理清空
解决:将代理设置为self,判断手势是否恢复,只需要判断在根控制器下,不需要滑动手势即可。
// 两个方法都可以,二选一即可
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return self.childViewControllers.count > ;
} - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
return self.childViewControllers.count > ;
}
为了给用户更好的体验效果,可以给程序添加全屏滑动效果。
实现:根据打印输出边缘滑动手势,不难发现一些东西:
UIScreenEdgePanGestureRecognizer:屏幕边缘手势
target=<_UINavigationInteractiveTransition 0x7f80c9ea1ad0>
action=handleNavigationTransition:
有了这些信息,只需要找到_UINavigationInteractiveTransition这个类就可以了,当设置手势代理之前打印输出self.interactivePopGestureRecognizer.delegate,可以发现手势代理就是这个类,实现代码:
- (void)viewDidLoad {
[super viewDidLoad];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
// 判断手势什么时候触发
pan.delegate = self;
// 添加手势
[self.view addGestureRecognizer:pan];
// 添加了全屏手势,边缘手势就没什么用了
// self.interactivePopGestureRecognizer.delegate = self;
}
全屏手势就这样实现了!
iOS中“返回”操作相关的更多相关文章
- iOS:文件操作相关(18-03-23更)
0.iOS文件系统 1.工程内文件 2.文件夹管理 3.文件操作 4.NSCache 附录: 1.沙盒文件夹.文件大小 2.清除沙盒 Library / Cache 下所有数据 3.测试plist 0 ...
- iOS中XML的相关知识
1.什么是XML “当 XML(扩展标记语言)于 1998 年 2 月被引入软件工业界时,它给整个行业带来了一场风暴.有史以来第一次,这个世界拥有了一种用来结构化文档和数据的通用且适应性强的格式,它不 ...
- iOS中sqlite3操作
声明:下面命令我没有所有使用过, 仅用于收藏, 欢迎大家指出当中的错误 'SELECT count(*) FROM sqlite_master WHERE type="table&qu ...
- Django中数据库操作相关的错误
问题:字段修改属性发生错误 1> >python manage.py makemigrations You are trying to add a non-nullable field ' ...
- IOS中字符串操作
1.比较大小 - (NSComparisonResult)compare:(NSString *)string; 返回值NSComparisonResult有3种情况: NSOrderedAscend ...
- iOS 中 延迟操作四种方式
本文列举了四种延时执行某函数的方法及其一些区别.假如延时1秒时间执行下面的方法. - (void)delayMethod { NSLog(@"execute"); } 1.perf ...
- IOS各种手势操作实例
先看下效果 手势相关的介绍 IOS中手势操作一般是 UIGestureRecognizer 类的几个手势子类去实现,一般我们用到的手势就这么5种: 1.点击 UITapGestureRecogniz ...
- iOS开发中获取WiFi相关信息
iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可能是与WiFi相关的. 1.Ping域名.Ping某IP 有 时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的p ...
- 关于ios中的文本操作-简介
来源:About Text Handling in iOS 官方文档 iOS平台为我们提供了许多在app中展示文本和让用户编辑文本的方式.同时,它也允许你在app视图中展示格式化的文本和网页内容.你可 ...
随机推荐
- C++设计模式-Adapter适配器模式(转)
Adapter适配器模式作用:将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 分为类适配器模式和对象适配器模式. 系统的数据和 ...
- HashMap的两种实现方式
本文主要简要分析了Java中和Redis中HashMap的实现,并且对比了两者的异同 1.Java的实现 下图表示了Java中一个HashMap的主要实现方式 因为大家对于Java中HashMap的实 ...
- 【Python全栈笔记】03 [模块二] 16-17 Oct 函数
定义一个函数 def function_name(形式参数): 代码块 return 'Value' #如果没有写return,则默认返回None # 一个函数到return这一行就结束执行了,在re ...
- JQuery Mobile入门——设置后退按钮文字(转)
http://www.tuicool.com/articles/AZnYVz JQuery Mobile入门——设置后退按钮文字 时间 2013-01-09 20:24:28 CSDN博客原文 h ...
- 程序中保存状态的方式之ViewState
程序中保存状态的方式有以下几种: 1.Application 2.Cookie 3.Session 4.ViewState:ViewState是保存状态的方式之一,ViewState实际就是一个Hid ...
- NGUI 屏幕自适应(初始设定宽高800x480只支持比其大的屏幕)
自适应讲解部分可以参考以下网址:http://www.xuanyusong.com/archives/2536,下面代码中提到的AdaptiveManualHeight()函数就是参考该文章的. 下面 ...
- java中运算符的优先级
所谓优先级,就是在表达式中的运算顺序.Java 中常用的运算符的优先级如下表所示: 级别为 1 的优先级最高,级别 11 的优先级最低.譬如,x = 7 + 3 * 2 得到的结果是 13 &quo ...
- 自定义刻度的SeekBar
<com.imibaby.client.views.CustomSeekbar android:id="@+id/myCustomSeekBar" android:layou ...
- 最简单的访问google的办法
我用的是猎豹浏览器,在工具下面的猎豹应用市场里面,搜索红杏,安装即可. 打开google产品地址时,如果地址栏里面右边的杏是绿色的,代表正常,如果是红色的,代表不正常. 可能是装了其他代理软件,如Sw ...
- iOS的后台任务
翻译自:http://www.raywenderlich.com/29948/backgrounding-for-ios (代码部分若乱码,请移步原链接拷贝) 自ios4开始,用户点击home按钮时, ...