美文网首页自鉴UI进价iOS 开发
iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

作者: 笨笨编程 | 来源:发表于2015-11-04 16:19 被阅读19971次

    前言


    先扯一会儿犊子


    本文简介
    见题知意 不再加以解释

    我相信针对每一个iOS开发者来说,除了根视图控制器外,所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面,其实,在很多应用和APP中,用户已经习惯了这个功能,然而,作为开发者的我们,也并没有为此做些什么,因为我们在创建项目时,苹果公司已经为我们都做好了,那么,我们这期就来聊一聊这系统自带的右滑方法以及如何修改和拦截这个不被重视的方法,

    什么时候会被拦截

    当我们使用代码或者用storyboard来创建一个新的控制器的时候,我们很少注意导航栏的leftItem~因为正常情况下, push 到下一个界面的leftItem就是上一个界面的 self.title ,并且它也就是一个返回的功能,所以,我们很少去在意这些,但当我们有些需求,需要自定义leftItem的时候~那么问题就来了,

    • 问题一:怎么自定义leftItem
    • 问题二:为什么系统自带的右滑返回手势失效
    • 问题三:怎么解决这个失效问题

    1.怎么自定义leftItem

    其实,这个东西嘛,说简单也是很简单的,因为,我们很明确的知道,左导航栏就一个功能,那就是返回上一个界面,很显然,是需要用户交互的必用按钮,
    说多了都是废话~直接上代码

    //自定义一个按钮
    UIButton  *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [leftBtn setTitle:@"返回" forState:UIControlStateNormal];
    [leftBtn addTarget:self action:@selector(backLastView) forControlEvents:UIControlEventTouchUpInside];
    leftBtn.frame = CGRectMake(0, 0, 60, 40);
    [leftBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    //将leftItem设置为自定义按钮
    UIBarButtonItem  *leftItem =[[UIBarButtonItem alloc]initWithCustomView: leftBtn];
    self.navigationItem.leftBarButtonItem = leftItem;
    
    //按钮点击事件  返回上一个界面
    - (void)backLastView{
        [self.navigationController popViewControllerAnimated:YES];
    }
    

    需要注意的是xcode自动从6.0之后,leftItem距左屏幕边距有16个像素点,这样会导致在视觉上会感觉有点偏右,不算美观,然而对于大多数处女座的程序员来说,这明显是不能让人去接受的,解决办法有很多,在这里提供一个最为方便的方法,设置一下按钮的contentEdgeInsets(文字)imageEdgeInsets(图片)属性即可,如:leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0);

    2.为什么系统自带的右滑返回手势失效
    这也是我一直所关心的问题,还希望知道的可以私信我
    QQ:2638006336

    3.怎么解决这个失效问题
    其实很简单很简单~只需要添加下面这一句代码即可
    self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
    后来很多网友反馈这里还是有点问题的,具体文章已经更新,可以参考 这篇文章
    或者直接联系我QQ也可以 *********(笨笨编程)

    ****写在结尾的话****

    其实到这里,问题应该都解决了,但是,毕竟右滑返回手势只能靠近屏幕左边缘才能使用,我们如何通过调用系统方法来实现在整个屏幕右滑就可以实现返回功能呢
    step1:需要获取系统自带滑动手势的target对象
    id target = self.navigationController.interactivePopGestureRecognizer.delegate;
    step2:创建全屏滑动手势~调用系统自带滑动手势的target的action方法
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    step3:设置手势代理~拦截手势触发
    pan.delegate = self;
    step4:别忘了~给导航控制器的view添加全屏滑动手势
    [self.view addGestureRecognizer:pan];
    step5:将系统自带的滑动手势禁用
    self.navigationController.interactivePopGestureRecognizer.enabled = NO;
    step6:还记得刚刚设置的代理吗?下面方法什么时候调用?在每次触发手势之前都会询问下代理,是否触发。
    这个方法就是拦截手势触发的方法.
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}
    return NO;则不需要触发滑动手势
    return YES;则需要触发滑动手势

    好啦好啦,差不多了,更多内容关注笨笨编程其他简书,这里有你将会更加精彩~

    相关文章

      网友评论

      • Dove_iOS:目前没发现什么问题,是不是文章内容改过?
        笨笨编程:哈哈哈。没有改过。在另一篇文章做了修改。
      • 谢衣丶:我想知道为什么我怎么样都禁止不了右滑返回的功能???自定义leftitem也没用 网上的代码全试过还是他妈能右滑返回.....
        笨笨编程:@谢衣丶 你使用storyboard还是纯代码布局的~
        谢衣丶:@笨笨编程 自定义leftitem是照搬的你的代码 没用.. 然后用if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
        self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        } 这行代码 也不行..
        笨笨编程:可否贴段代码看一下
      • e2f2d779c022:博主写的真好, 我自己封装了一个类似的框架,感兴趣的可以看下https://github.com/Chris-Pan/JPNavigationController
        笨笨编程:@NewPan 谢谢
      • 902fb8430604:怎么我用那一行代码会 程序会崩掉呀
        笨笨编程:@902fb8430604 你在这一行打断点~确定是因为这一行崩溃的?可否截个图~看一下你的代码~
        902fb8430604:@笨笨编程 viewdidload self.navigationController.interactivePopGestureRecognizer.delegate = (id)self; 我是自定义的导航栏
        笨笨编程:@902fb8430604 。。。。。。
        你在哪里加的~哪一行代码~
      • 泡沫1314:我工程里使用自定义NavigationController自定义的leftbtnitem,实现了gestureRecognizerShouldBegin的方法。在某一页面我想禁用系统的右滑返回手势,不管在哪设置self.navigationController.interactivePopGestureRecognizer.enabled = NO;都不管用 请问有什么好的解决方式吗?
        笨笨编程:@泡沫1314 你好~在viewDidAppear方法里写 self.navigationController.interactivePopGestureRecognizer.enabled = NO;这样也不行麽~
      • brother牛:你如果只用上面那一行代码来解决问题的话,那出现一个很可怕的bug,当处于根控制器的时候,再从左向右滑动之后,再点击控制器的跳转事件,结果直接就卡死了
        廿有四:对的,好久才发现这个bug,刚刚解决了。
        画眼线的乞丐:@笨笨编程 这个问题还有一个一行代码解决问题的办法,就是在不需要右滑手势的控制器里的viewDidAppear方法里写 self.navigationController.interactivePopGestureRecognizer.enabled = NO;
        笨笨编程:@brother牛 对的~4楼已经提过这个问题~问题也已经在回复中解决了~
      • 温特儿:楼主在扯,赶紧删掉,不要误人子弟!!!
        菜鸟吃咸鱼:那你给一个你认为的简单有效的方法贴出来
        温特儿:@笨笨编程 我不是什么大神,接触IOS没多长时间,只不过觉得,你这种做法,把问题复杂化了
        笨笨编程:@winterSeven 。。。。。。大神,本人才疏学浅,还望指教奥。
      • 煜寒了:关于第二个问题的答复:http://www.jianshu.com/p/349636eb3fca
      • 417e70ffc91b:我想问一下。。我这个加了self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
        这个以后 可以滑动返回了,但是来回滑动以后,偶尔会出现卡顿的现象。。好像是因为自定义nav导致的失效。有什么解决办法呢
        笨笨编程:@哲光朦胧仍相依 你好,问题已经收到,确实存在这个问题。麻烦留个qq给我,我会再第一时间解决后回复你!
        417e70ffc91b:是这样的。比如在首页了。不能靠右划返回了。。继续右划的话没反应,但是我随即点一个页面的话就会暂时卡在这,比较明显的现象就是点哪里都没反映了,还有导航上的那个图片什么的都不显示。一开始以为到这里卡死了。后来测试发现,只有再继续右划,才会有反映。反映就是本来应该跳转的页面现在跳了,但是因为现在也在右划,直接又划过去了。。。大概就是这样 :relaxed:
        笨笨编程:@哲光朦胧仍相依 你好,你所说的卡顿现象是指在来回滑动之后,然后,某些按钮或者什么不能用户交互了麽?我不太明白你所说的卡顿是什么意思。 :pensive:
      • 1b050448be4c:又抓到你上班不干活,还写文章。这个月工资扣两千,通报批评,一会儿来填单子。
        dongwenbo:@烟灰黯淡 :fearful:
      • a1fa7d3ca5b0:真的是扯,很啰嗦。一行代码就能搞定的事非要整成一篇文章。对此表示很无奈...
        Page_online:@下雨的声音滴答 他这个有问题,请看这里http://www.jianshu.com/p/c216306fca8d

      本文标题:iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

      本文链接:https://www.haomeiwen.com/subject/hkoqhttx.html