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-自定义导航栏后侧滑返回功能失效相关推荐

  1. IOS 自定义导航栏标题和返回按钮标题

    IOS中自定义导航栏标题: UILabel *titleText = [[UILabel alloc] initWithFrame: CGRectMake(160, 0, 120, 50)]; tit ...

  2. 微信小程序自定义导航栏 navigation bar 返回键 首页

    微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键.首页键,动态设置标题,响应式组件 版本号:2.0.0 作者:chen-yt github: https://g ...

  3. 微信小程序 ios自定义导航栏 下拉“橡皮筋” 效果

    问题: 1.微信小程序ios中如果自定义导航栏取消了橡皮筋效果页面无法滑动 2.如果不取消,页面往下拉时会与顶部有一大片空白(安卓本身scrollTop不会有负值) 3.fixed之后absolute ...

  4. iOS 自定义导航栏 NavigationBar

    自定义一个导航栏,包括左侧.右侧按钮,中间的title. 效果图: 代码: Swift版 // 创建一个导航栏 let navBar = UINavigationBar(frame: CGRectMa ...

  5. dismiss ios pop效果_iOS正确解决隐藏导航栏后push和pop或dismiss和present闪黑问题

    情景: 一级页面不显示导航栏 ,二级页面显示导航栏. 方法一 适用于push/pop: 一级页面中 - (void)viewWillAppear:(BOOL)animated { [super vie ...

  6. 微信小程序的自定义导航栏

    微信小程序的导航栏主要分为两个部分:状态栏和标题栏. 关于微信小程序的自定义导航栏也就是通过微信小程序官方提供的API接口来算出状态栏和标题栏的高度. 注意获取到的数值单位都是px. 首先要开启自定义 ...

  7. 小程序自定义导航栏使用整理

    一.如何开启自定义导航栏 从页面配置或者全局配置修改navigationStyle的属性 navigationStyle: 导航栏样式,仅支持以下值: default 默认样式 custom 自定义导 ...

  8. 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更 ...

  9. 微信小程序自定义导航栏组件(完美适配所有手机),可自定义实现任何你想要的功能

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...

  10. 【愚公系列】2022年09月 微信小程序-自定义导航栏功能的实现

    文章目录 前言 一.自定义导航栏功能的实现 1.组件的封装 2.使用 前言 导航栏是指位于页面顶部或者侧边区域的,在页眉横幅图片上边或下边的一排水平导航按钮,它起着链接站点或者软件内的各个页面的作用. ...

最新文章

  1. windows 安装MySQL服务 zip解压程序
  2. volatile关键字对
  3. 【小代码讲解】独热编码(One-Hot编码)
  4. Tcp Keepalive和HTTP Keepalive详解
  5. IOS 定时器 NSTimer
  6. 进行数据清洗_[经验漫谈]使用Python进行数据表格清洗和分析
  7. SpringBoot之Dubbox
  8. 2017云计算与IT风向标-------- 移动、转型、整合
  9. laravel安装指定版本
  10. 发票OCR识别验真接口简介
  11. luogu_1378 油滴扩展
  12. Xilinx软件开发:PMU实验
  13. 023-公平感|领导者的内功
  14. Linux初探之如何查看帮助文档自学命令
  15. golang:%v,%+v,%#v区别
  16. 【转载】 身份证号码校验(15位和18位都可以)
  17. python 隐函数作图(原创简单方法)
  18. 如何快速的开发一个完整的iOS直播app(原理篇)
  19. 【CS 1376】帕秋莉•诺蕾姬(Hash)
  20. 学习JAVA的随性笔记-权限修饰符

热门文章

  1. flag - 待浏览学习网站
  2. Head First C 学习日志 第十章 进程间通信 输入输出重定向
  3. Java中集合list的add方法添加的不是值COPY而是地址
  4. 成功就是成为最好的你自己
  5. openssl做HMAC实例(C++)
  6. 怎么样装mysql_如何安装MySQL数据库
  7. adodb.connection id password windows用户_Windows 12发布了?一款号称可以取代win10的山寨Windows系统...
  8. StringBoot接收XML参数,Java解析XML参数并封装
  9. MYSQL当前时间与数据库里数据时间做比较
  10. 你必须掌握的Python数据分析工具之Numpy