UINavigationController滑动返回

UINavigationController全屏滑动返回

//注销系统方法
   self.interactivePopGestureRecognizer.enabled = NO;

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

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

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

UINavigationController左边缘滑动返回

// 为了获取保存系统的 代理
@property (nonatomic ,assign) id target;
// 获取系统自带滑动手势的target对象
    self.target = self.interactivePopGestureRecognizer.delegate;
// 实现UINavigationControllerDelegate的代理和声明 
    self.delegate = self;
//UINavigationControllerDelegate 代理方法
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    
    if (viewController == [self.viewControllers firstObject] )
    {
        self.interactivePopGestureRecognizer.delegate = self.target;
    }
}

-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (self.childViewControllers.count>0)
    {
       // 设置导航条左边按钮的内容,把系统的返回按钮给覆盖,导航控制器的滑动返回功能就消失了 
       //覆盖后如果不把系统滑动返回功能注销 或自己重新实现 在首界面左边缘滑动会崩溃
     // 注销方法self.interactivePopGestureRecognizer.delegate = nil;
        UIButton *button = [[UIButton alloc] init];
        [button setImage:[UIImage imageNamed:@"返回"] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(backButtonClick) forControlEvents:UIControlEventTouchUpInside];
        button.size = button.currentImage.size;
        viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
        self.navigationBarHidden=NO;
        self.interactivePopGestureRecognizer.delegate = nil;
        viewController.automaticallyAdjustsScrollViewInsets=NO;
    }
    [super pushViewController:viewController animated:animated];
}
-(void)backButtonClick
{
    [self popViewControllerAnimated:YES];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容