iOS-虚心若愚,求知若饥寒哥管理的技术专题Swifty Coding

关于滑动返回手势新发现

2015-12-24  本文已影响391人  saiGo

相信对于滑动返回手势大家都不会陌生了,不就是导航控制器自带的滑动返回手势嘛,系统自带的功能。当自定义导航条的返回按钮的时候,再自己定义一下滑动返回手势的代理,然后为了解决假死问题,实现一个返回BOOL值的代理方法,如果是导航控制器的跟控制器就返回NO,否则返回YES。代码如下:

//这里的协议是 UIGestureRecognizerDelegate
self.interactivePopGestureRecognizer.delegate = self;

//<UIGestureRecognizerDelegate>协议中的方法
//为了解决假死问题实现的代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
//如果子控制器只有一个,就是根控制器,就不要让左滑返回有效了
    return (self.childViewControllers.count >1);
}

以上内容相信大家都是非常熟悉的了,所以在这里就不再继续讨论了。

但是通过以上代码实现的滑动返回时候只能是手指在屏幕边缘滑动才会生效,一个如此不方便的滑动返回手势其实相当鸡肋的(我更多时候宁愿点击返回按钮)。
不过如果这个手势的有效范围扩大到整个的屏幕的话,那就大大不同了,那么现在就一起来看看如何实现整个屏幕范围有效的滑动返回手势吧,其中相当一部分代码我本人表示看不懂,如有明白其中缘由的网友也希望能够请分享一下给大家。以下就是代码实现:

UIScreenEdgePanGestureRecognizer *gesture = (UIScreenEdgePanGestureRecognizer *)self.interactivePopGestureRecognizer;
    
    gesture.enabled  = NO;
  
    NSMutableArray *targets = [gesture valueForKeyPath:@"_targets"];

    id gestureTarget = [targets firstObject];
    
    id target = [gestureTarget valueForKeyPath:@"_target"];
    
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
    
    [gesture.view addGestureRecognizer:pan];

到这里,就可以实现滑动返回手势了,但是这时候你会沮丧地发现烦人的假死问题又出现了,虽然这种情况下的假死问题并不严重,通过对屏幕一顿猛拖猛点还是可以恢复的,但也足以让人抓狂。
如何解决假死问题呢?以下代码是上面代码的后续:

##注意,这里下面的代码是连接着上面一段的代码。
//这里遵守的协议是 UIGestureRecognizerDelegate
    gesture.delegate = self;

//<UIGestureRecognizerDelegate>协议中的方法
//为了解决假死问题实现的代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{//如果子控制器只有一个,就是根控制器,就不要让左滑返回有效了  
      return (self.childViewControllers.count >1);
}

加上上述代码之后,便可以畅心地使用滑动返回手势了,从此表示再也不点左上角的返回按钮了!

上一篇下一篇

猜你喜欢

热点阅读