美文网首页码农的日常之iOS开发iOS 技术文集iOS开发
iOS 自定义返回按钮,保留系统滑动返回

iOS 自定义返回按钮,保留系统滑动返回

作者: 倚楼听风雨wing | 来源:发表于2016-09-09 15:13 被阅读2542次
    自定义返回按钮保留系统滑动返回手势.gif

    1.简介

    使用苹果手机,最喜欢的就是用它的滑动返回.作为一个开发者,我们在编写很多页面的时候,总是会因为这样那样的原因使得系统的滑动返回不可用.使用导航栏push出一个控制器,我们在控制器中自定义了一个返回按钮.这样系统默认的滑动返回手势效果就没有了.

    2.解决方法

    [1]从A这个控制器push到B这个控制器,我们想要自定义B的返回按钮,我们可以在A中设置

    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"王俨" style:UIBarButtonItemStylePlain target:nil action:nil];
    

    [2]在B控制器设置返回按钮,我想这应该是大多数人喜欢的选择,可是当我们在B控制器中设置self.navigationItem.leftBarButtonItem后发现系统的滑动返回手势失效了.那么如何可以保留系统的滑动返回手势了,我们可以B控制器中这样做.

    @interface ViewController () <UIGestureRecognizerDelegate>
    @end
    
    @implementation ViewController {
        id<UIGestureRecognizerDelegate> _delegate
    }
    
    - (void)viewDidLoad {
            [super viewDidLoad];
            
            // 自定义返回按钮
            UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 44, 44)];
            [button setTitle:@"王俨2" forState:UIControlStateNormal];
            [button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
            [button addTarget:self action:@selector(back:) forControlEvents:UIControlEventTouchUpInside];
            
            self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:button];
    }
    
    - (void)back:(UIButton *)button {
            [self.navigationController popViewControllerAnimated:YES];
    }
    
    - (void)viewWillAppear:(BOOL)animated {
        [super viewWillAppear:animated];
        
        if (self.navigationController.viewControllers.count > 1) {
              // 记录系统返回手势的代理
            _delegate = self.navigationController.interactivePopGestureRecognizer.delegate;
              // 设置系统返回手势的代理为当前控制器
            self.navigationController.interactivePopGestureRecognizer.delegate = self;
        }
    }
    
    - (void)viewWillDisappear:(BOOL)animated {
        [super viewWillDisappear:animated];
        
         // 设置系统返回手势的代理为我们刚进入控制器的时候记录的系统的返回手势代理
        self.navigationController.interactivePopGestureRecognizer.delegate = _delegate;
    }
    
    #pragma mark - UIGestureRecognizerDelegate
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
            return self.navigationController.childViewControllers.count > 1;
    }
    
    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
        return self.navigationController.viewControllers.count > 1;
    }
    @end
    

    相关文章

      网友评论

      • 十一岁的加重:就自定义一张图片而已,搞这么麻烦
      • 旅店老板:_delegate这个的声明在哪呢?
        倚楼听风雨wing:@Pladin 不好意思,我更新一下,_delegate是一个成员变量
      • Charles___:不只是自定义了返回按钮,自定义了leftBarButtonItem,他的系统侧滑就会失效。其实在viewDidload里面加上这句话就好了,只需要一句话。 if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
        {
        self.interactivePopGestureRecognizer.delegate = weakSelf;
        }
        Charles___:@倚楼听风雨wing 写baseViewController
        倚楼听风雨wing:@CharlesJF 你这样是可以解决问题,可是如果,离开了当前控制器过后,push到别的控制器,这个时候系统的滑动返回的效果就没有了,原因是:滑动返回的代理被你更改了.
        CNGoat:@CharlesJF 🐂比
      • 春花秋月2020:找到方案啦

      本文标题:iOS 自定义返回按钮,保留系统滑动返回

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