全屏右滑返回的一些事一些情

作者: Fasa | 来源:发表于2015-09-12 00:10 被阅读5271次

前因

人活一辈子,总要遇上一些事情。
拿我自己来说
便是实现iOS全屏右滑返回。

我开始参考的是啊崢的文章
【8行代码教你搞定导航控制器全屏滑动返回效果】

实现起来却是遇上了不少问题,因为手势代理方法做的判断不够完善,还有好几个情况下触发手势导致bug出现。

总的来说有三种情况下手势不应该执行:

  • 当前controller是rootViewController时
  • pop动画正在进行时
  • 左滑时

另外。
该文采取的办法是对navigationController自带的interactivePopGestureRecognizer下手,禁用interactivePopGestureRecognizer,给interactivePopGestureRecognizer的delegate换上自定义的UIPanGestureRecognizer。

是否有更简单的办法?有的。

// 更换interactivePopGestureRecognizer的delegate
// 这里设置为navigationController自己
    self.interactivePopGestureRecognizer.delegate = self;
// 自带的边缘返回手势的类是UIScreenEdgePanGestureRecognizer,只负责edge部分
// 那么换成包容心更强的UIPanGestureRecognizer
    object_setClass(self.interactivePopGestureRecognizer, [UIPanGestureRecognizer class]);

可是还是喜欢拿来主义。
于是在github上找到:
sunnyxxx的FDFullscreenPopGesture

sunnyxxx已经封装得很完美了,完全AOP。在其手势代理方法中,除了上面提到的三种情况,还增加了两种情况,通过设置controller的两个属性控制手势。

  • fd_interactivePopDisabled:可单独关闭某个controller的滑动返回手势
  • fd_interactivePopMaxAllowedInitialDistanceToLeftEdge:自定义手势范围。

拿来主义真好。
我把代码改了下,对delegate下手,代码如下。

//    if (![self.interactivePopGestureRecognizer.view.gestureRecognizers containsObject:self.fd_fullscreenPopGestureRecognizer]) {
//        
//        // Add our own gesture recognizer to where the onboard screen edge pan gesture recognizer is attached to.
//        [self.interactivePopGestureRecognizer.view addGestureRecognizer:self.fd_fullscreenPopGestureRecognizer];
//
//        // Forward the gesture events to the private handler of the onboard gesture recognizer.
//        NSArray *internalTargets = [self.interactivePopGestureRecognizer valueForKey:@"targets"];
//        id internalTarget = [internalTargets.firstObject valueForKey:@"target"];
//        SEL internalAction = NSSelectorFromString(@"handleNavigationTransition:");
//        self.fd_fullscreenPopGestureRecognizer.delegate = self.fd_popGestureRecognizerDelegate;
//        [self.fd_fullscreenPopGestureRecognizer addTarget:internalTarget action:internalAction];
//
//        // Disable the onboard gesture recognizer.
//        self.interactivePopGestureRecognizer.enabled = NO;
//    }
    
    if ([self.interactivePopGestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) {
        object_setClass(self.interactivePopGestureRecognizer, [UIPanGestureRecognizer class]);
        self.interactivePopGestureRecognizer.delegate = self.fd_popGestureRecognizerDelegate;
    }

后果

再也不需要自定义手势+截图实现返回转场那种老方法了。

相关文章

  • 全屏右滑返回的一些事一些情

    前因 人活一辈子,总要遇上一些事情。拿我自己来说便是实现iOS全屏右滑返回。 我开始参考的是啊崢的文章【8行代码教...

  • 全屏右滑返回

  • 全屏右滑返回

    以上全屏返回效果只需要在 UINavigationController 中写入下面代码 代码分析 这句代码目的是获...

  • ios 右滑返回和边缘右滑返回

    以下两篇文章可以解决所有的右滑问题 参考 iOS | 全屏右滑返回详解 iOS右滑返回手势深度全解和最佳实施方案

  • iOS 右滑返回

    iOS 右滑返回 BBGestureBack iOS 全屏手势返回 滑动返回 pop 动画效果 这种手势主流App...

  • iOS 实现全屏右滑返回

    1.系统右滑返回 在开发中,当push到一个新控制器的时候,系统自带了一个右滑返回的手势,不过这个手势只能是在屏幕...

  • iOS | 全屏右滑返回详解

    随着手机屏幕的变大,原来右滑返回略显不够人性化,尤其是对手小的朋友,让我如何单手玩手机.对于app要全屏右滑或保持...

  • 一个丝滑的全屏滑动返回手势

    原文地址:一个丝滑的全屏滑动返回手势 全屏返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互的支...

  • IOS 全屏滑动返回手势

    全屏返回手势 本文章摘自于:一个丝滑的全屏滑动返回手势 自 iOS7 之后,Apple 增加了屏幕边缘右划返回交互...

  • IOS开发: 全屏右划pop过程中, 返回手势与scrollVi

    注意: 这里主要是对于scrollView和返回手势的冲突处理 效果图如下: 全屏右滑pop返回请看 iOS开发...

网友评论

  • 让代码飞:请问这个东西该怎么用
  • 会武的锄头:楼主,我自定义导航栏,重写push方法,判断当控制器数量>1的时候leftBarButton为自定义图片,使用FDFullscreenPopGesture出现问题,在返回rootViewControllew的时候,leftBarButton还是会出现
  • TonyDuan:这个是方法可以上架不呢?
    Fasa:@TonyDuan 可以
  • 十一岁的加重:改天试试
  • 91阿生:请问下,fd这个框架,对其他控制器中的手势有冲突,例如swip。这个如何解决避免冲突呢
    Fasa:@91阿生 出现该类情况,请设置viewController的fd_interactivePopDisabled = YES
  • ddaa8dae50b0:7以下能用吗?
    Fasa:@OrlAnd0 不行的
  • 叶舞清风:你写错了啊,forkingdog
    叶舞清风:@Fasa 我有一个更好的
    叶舞清风:@Fasa 好吧
    Fasa:@叶舞清风 没有错的哦,sunny是网名

本文标题:全屏右滑返回的一些事一些情

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