iOS --导航控制器右滑返回手势 与 全屏滑动 效果

右滑返回手势 效果

  • 实现:需要自定义导航控制器,JPNavigationController

思路分析:

  • 右滑返回手势的代理设置给导航控制器,每当用户触发右滑返回手势就会调用
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
iOS --导航控制器右滑返回手势 与 全屏滑动 效果_第1张图片
Snip20150902_11.png

实现

  • 1.设置代理
@interface JPNavigationController () 
@implementationJPNavigationController
- (void)viewDidLoad {
    [super viewDidLoad];
    
   // 设置代理
    self.interactivePopGestureRecognizer.delegate = self;
}
@end
  • 2.实现代理方法

#pragma mark - 
/**
 * 每当用户触发[返回手势]时都会调用一次这个方法
 * 返回值:返回YES,手势有效; 返回NO,手势失效
 */
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 如果当前显示的是第一个子控制器,就应该禁止掉[返回手势]
//    if (self.childViewControllers.count == 1) return NO;
//    return YES;
    return self.childViewControllers.count > 1; // 处理后,就不会出现黑边效果的bug了。
}
注意:push导航控制器的子控制器时,有黑边
iOS --导航控制器右滑返回手势 与 全屏滑动 效果_第2张图片
Snip20150902_5.png
  • 经过上面的处理,之后不会出现该bug

return self.childViewControllers.count > 1;

+ 但是如果没有处理就有可能出现黑边
  - 原因如下:
   + 如果导航控制器的子控制器的数量大于1,从导航控制器的第一个子控制器滑动到下一个带颜色的子控制器,会有个阴影(因为滑动的子控制器有颜色)
 - 解决方案
     - 判断导航控制器的子控制器的数量,大于1使右滑手势生效:不是第一个子控制器的时候,在滑动手势的代理方法gestureRecognizerShouldBegin:...,返回YES=》滑动手势生效,否则返回NO=》滑动返回手势不生效

#### 右滑全屏返回按钮
+ 默认系统只提供了控制器的左边滑动功能,而未提供全屏滚动效果
+ 见 [阿峥]: http://www.jianshu.com/p/bc85a3d37519
   - 实现代码如下:

```objc
- (void)viewDidLoad {
    [super viewDidLoad];

    // 获取系统自带滑动手势的target对象
    id target = self.interactivePopGestureRecognizer.delegate;

    // 创建全屏滑动手势,调用系统自带滑动手势的target的action方法
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];

    // 设置手势代理,拦截手势触发
    pan.delegate = self;

    // 给导航控制器的view添加全屏滑动手势
    [self.view addGestureRecognizer:pan];

    // 禁止使用系统自带的滑动手势
    self.interactivePopGestureRecognizer.enabled = NO;

}

// 什么时候调用:每次触发手势之前都会询问下代理,是否触发。
// 作用:拦截手势触发
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 注意:只有非根控制器才有滑动返回功能,根控制器没有。
    // 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器
    if (self.childViewControllers.count == 1) {
        // 表示用户在根控制器界面,就不需要触发滑动手势,
        return NO;
    }
    return YES;
}

你可能感兴趣的:(iOS --导航控制器右滑返回手势 与 全屏滑动 效果)