iOS-自定义导航栏后侧滑返回功能失效
iPhone有一个回退按钮在所有的导航条上.这是一个简单的没有文字箭头.
在一开始写项目的时候,就要做好一个准备,导航栏是自定义还是使用系统的,后期有什么改动,有什么比较特殊的需求、当然这些在更改需求的同时,很多东西都已经被改得面目全非了。
完全自定义导航栏,在实际开发中,并不能满足特殊需求,因此更多情况下,还是需要配合系统导航栏自定义,从而达到我们想要的效果。当我们自定义返回按钮之后,就会出现系统的右滑Pop功能就失效了,这是其中的一个小问题,下面就跟大家分享一下我所了解到的:
实现一个自定义按钮是简单的.类似这个设置controller 的navigationItem一个leftBarButtonItem.
1 文/煜寒了(简书作者) 2 原文链接:http://www.jianshu.com/p/349636eb3fca 3 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 4 5 - (void)viewDidLoad 6 { 7 self.navigationItem.leftBarButtonItem = [self backButton]; 8 } 9 10 - (UIBarButtonItem *)backButton 11 { 12 UIImage *image = [UIImage imageNamed:@"back_button"]; 13 CGRect buttonFrame = CGRectMake(0, 0, image.size.width, image.size.height); 14 15 UIButton *button = [[UIButton alloc] initWithFrame:buttonFrame]; 16 [button addTarget:self action:@selector(backButtonPressed) forControlEvents:UIControlEventTouchUpInside]; 17 [button setImage:[UIImage imageNamed:normalImage] forState:UIControlStateNormal]; 18 19 UIBarButtonItem *item; = [[UIBarButtonItem alloc] initWithCustomView:button]; 20 21 return item; 22 }
View Code
但是这样在iOS7上 pop手势交互就不好使了.我发现了一个轻松解决的办法.通过我的beta测试者,我收到了很多关于pop手势的崩溃日志.我发现在栈中推入一个controller后,快速向左平滑,将会引起崩溃.换句话说,如果用户在推入还在进行的时候立即去点击返回.那么导航控制器就秀逗了.我在调试日志里面发现这些:
nested pop animation can result in corrupted navigation bar
经过几个小时的奋斗和尝试,我发现可以缓解这个错误:设置手势的delegate为这个导航控制器就像Stuart Hall在他的帖子说的那样,分配了一个手势交互行为的委托在自定义按钮显示的时候.然后,当用户快速点击退出的时候,控制器因为手势发送了一个消息在本身已经被销毁的时候.我的解决方案是简单的让NavigationController自己成为响应的接受者.最好用一个UINavigationController的子类.
1 文/煜寒了(简书作者) 2 原文链接:http://www.jianshu.com/p/349636eb3fca 3 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 4 5 @interface CBNavigationController : UINavigationController <UIGestureRecognizerDelegate> 6 @end 7 8 @implementation CBNavigationController 9 10 - (void)viewDidLoad 11 { 12 __weak CBNavigationController *weakSelf = self; 13 14 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) 15 { 16 self.interactivePopGestureRecognizer.delegate = weakSelf; 17 } 18 } 19 20 @end
View Code
在转场/过渡的时候禁用 interactivePopGestureRecognizer当用户在转场的时候触发一个后退手势,则各种事件又凑一块了.导航栈内又成了混乱的.我的解决办法是,转场效果的过程中禁用手势识别,当新的视图控制器加载完成后再启用.再次建议使用UINavigationController的子类操作.
1 文/煜寒了(简书作者) 2 原文链接:http://www.jianshu.com/p/349636eb3fca 3 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 4 5 @interface CBNavigationController : UINavigationController <UINavigationControllerDelegate, UIGestureRecognizerDelegate> 6 @end 7 8 @implementation CBNavigationController 9 10 - (void)viewDidLoad 11 { 12 __weak CBNavigationController *weakSelf = self; 13 14 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) 15 { 16 self.interactivePopGestureRecognizer.delegate = weakSelf; 17 self.delegate = weakSelf; 18 } 19 } 20 21 // Hijack the push method to disable the gesture 22 23 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated 24 { 25 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) 26 self.interactivePopGestureRecognizer.enabled = NO; 27 28 [super pushViewController:viewController animated:animated]; 29 } 30 31 #pragma mark UINavigationControllerDelegate 32 33 - (void)navigationController:(UINavigationController *)navigationController 34 didShowViewController:(UIViewController *)viewController 35 animated:(BOOL)animate 36 { 37 // Enable the gesture again once the new controller is shown 38 39 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) 40 self.interactivePopGestureRecognizer.enabled = YES; 41 } 42 43 44 @end
View Code
2015-07-21 更新 解决左滑手势冲突和不灵敏的问题
1 文/煜寒了(简书作者) 2 原文链接:http://www.jianshu.com/p/349636eb3fca 3 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。 4 5 -(UIViewController *)popViewControllerAnimated:(BOOL)animated { 6 7 return [super popViewControllerAnimated:YES]; 8 } 9 10 #pragma mark UINavigationControllerDelegate 11 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 12 if ([self.childViewControllers count] == 1) { 13 return NO; 14 } 15 return YES; 16 } 17 18 // 我们差不多能猜到是因为手势冲突导致的,那我们就先让 ViewController 同时接受多个手势吧。 19 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 20 { 21 return YES; 22 } 23 //运行试一试,两个问题同时解决,不过又发现了新问题,手指在滑动的时候,被 pop 的 ViewController 中的 UIScrollView 会跟着一起滚动,这个效果看起来就很怪(知乎日报现在就是这样的效果),而且也不是原始的滑动返回应有的效果,那么就让我们继续用代码来解决吧 24 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 25 { 26 return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class]; 27 } 28 29 -(UIViewController *)popViewControllerAnimated:(BOOL)animated { 30 31 return [super popViewControllerAnimated:YES]; 32 } 33 34 #pragma mark UINavigationControllerDelegate 35 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { 36 if ([self.childViewControllers count] == 1) { 37 return NO; 38 } 39 return YES; 40 } 41 42 // 我们差不多能猜到是因为手势冲突导致的,那我们就先让 ViewController 同时接受多个手势吧。 43 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 44 { 45 return YES; 46 } 47 //运行试一试,两个问题同时解决,不过又发现了新问题,手指在滑动的时候,被 pop 的 ViewController 中的 UIScrollView 会跟着一起滚动,这个效果看起来就很怪(知乎日报现在就是这样的效果),而且也不是原始的滑动返回应有的效果,那么就让我们继续用代码来解决吧 48 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 49 { 50 return [gestureRecognizer isKindOfClass:UIScreenEdgePanGestureRecognizer.class]; 51 }
View Code
转载于:https://www.cnblogs.com/fengmin/p/5318817.html
iOS-自定义导航栏后侧滑返回功能失效相关推荐
- IOS 自定义导航栏标题和返回按钮标题
IOS中自定义导航栏标题: UILabel *titleText = [[UILabel alloc] initWithFrame: CGRectMake(160, 0, 120, 50)]; tit ...
- 微信小程序自定义导航栏 navigation bar 返回键 首页
微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键.首页键,动态设置标题,响应式组件 版本号:2.0.0 作者:chen-yt github: https://g ...
- 微信小程序 ios自定义导航栏 下拉“橡皮筋” 效果
问题: 1.微信小程序ios中如果自定义导航栏取消了橡皮筋效果页面无法滑动 2.如果不取消,页面往下拉时会与顶部有一大片空白(安卓本身scrollTop不会有负值) 3.fixed之后absolute ...
- iOS 自定义导航栏 NavigationBar
自定义一个导航栏,包括左侧.右侧按钮,中间的title. 效果图: 代码: Swift版 // 创建一个导航栏 let navBar = UINavigationBar(frame: CGRectMa ...
- dismiss ios pop效果_iOS正确解决隐藏导航栏后push和pop或dismiss和present闪黑问题
情景: 一级页面不显示导航栏 ,二级页面显示导航栏. 方法一 适用于push/pop: 一级页面中 - (void)viewWillAppear:(BOOL)animated { [super vie ...
- 微信小程序的自定义导航栏
微信小程序的导航栏主要分为两个部分:状态栏和标题栏. 关于微信小程序的自定义导航栏也就是通过微信小程序官方提供的API接口来算出状态栏和标题栏的高度. 注意获取到的数值单位都是px. 首先要开启自定义 ...
- 小程序自定义导航栏使用整理
一.如何开启自定义导航栏 从页面配置或者全局配置修改navigationStyle的属性 navigationStyle: 导航栏样式,仅支持以下值: default 默认样式 custom 自定义导 ...
- 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况
背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更 ...
- 微信小程序自定义导航栏组件(完美适配所有手机),可自定义实现任何你想要的功能
背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...
- 【愚公系列】2022年09月 微信小程序-自定义导航栏功能的实现
文章目录 前言 一.自定义导航栏功能的实现 1.组件的封装 2.使用 前言 导航栏是指位于页面顶部或者侧边区域的,在页眉横幅图片上边或下边的一排水平导航按钮,它起着链接站点或者软件内的各个页面的作用. ...
最新文章
- windows 安装MySQL服务 zip解压程序
- volatile关键字对
- 【小代码讲解】独热编码(One-Hot编码)
- Tcp Keepalive和HTTP Keepalive详解
- IOS 定时器 NSTimer
- 进行数据清洗_[经验漫谈]使用Python进行数据表格清洗和分析
- SpringBoot之Dubbox
- 2017云计算与IT风向标-------- 移动、转型、整合
- laravel安装指定版本
- 发票OCR识别验真接口简介
- luogu_1378 油滴扩展
- Xilinx软件开发:PMU实验
- 023-公平感|领导者的内功
- Linux初探之如何查看帮助文档自学命令
- golang:%v,%+v,%#v区别
- 【转载】 身份证号码校验(15位和18位都可以)
- python 隐函数作图(原创简单方法)
- 如何快速的开发一个完整的iOS直播app(原理篇)
- 【CS 1376】帕秋莉•诺蕾姬(Hash)
- 学习JAVA的随性笔记-权限修饰符
热门文章
- flag - 待浏览学习网站
- Head First C 学习日志 第十章 进程间通信 输入输出重定向
- Java中集合list的add方法添加的不是值COPY而是地址
- 成功就是成为最好的你自己
- openssl做HMAC实例(C++)
- 怎么样装mysql_如何安装MySQL数据库
- adodb.connection id password windows用户_Windows 12发布了?一款号称可以取代win10的山寨Windows系统...
- StringBoot接收XML参数,Java解析XML参数并封装
- MYSQL当前时间与数据库里数据时间做比较
- 你必须掌握的Python数据分析工具之Numpy