美文网首页
导航栏默认返回按钮事件拦截

导航栏默认返回按钮事件拦截

作者: Coder_Star | 来源:发表于2019-08-09 17:36 被阅读0次
  • 按钮点击事件
//UIViewController+BackButtonHandler.h

#import <UIKit/UIKit.h>

@protocol BackButtonHandlerProtocol <NSObject>
@optional
-(BOOL)navigationShouldPopOnBackButton;
@end

@interface UIViewController (BackButtonHandler) <BackButtonHandlerProtocol>

@end

//UIViewController+BackButtonHandler.m
#import "UIViewController+BackButtonHandler.h"

@implementation UIViewController (BackButtonHandler)

@end

@implementation UINavigationController (ShouldPopOnBackButton)

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

    if([self.viewControllers count] < [navigationBar.items count]) {
        return YES;
    }

    BOOL shouldPop = YES;
    UIViewController* vc = [self topViewController];
    if([vc respondsToSelector:@selector(navigationShouldPopOnBackButton)]) {
        shouldPop = [vc navigationShouldPopOnBackButton];
    }

    if(shouldPop) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [self popViewControllerAnimated:YES];
        });
    } else {
        for(UIView *subview in [navigationBar subviews]) {
            if(0. < subview.alpha && subview.alpha < 1.) {
                [UIView animateWithDuration:.25 animations:^{
                    subview.alpha = 1.;
                }];
            }
        }
    }

    return NO;
}

@end

我们在需要拦截按钮的ViewController里面重写navigationShouldPopOnBackButton这个方法,返回true正常返回,返回false事件被拦截,点击按钮无反应

override func navigationShouldPopOnBackButton() -> Bool {
        return false
 }
  • 手势右滑事件
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    self.navigationController?.interactivePopGestureRecognizer?.delegate = self
}

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(true)
        self.navigationController?.interactivePopGestureRecognizer?.delegate = nil
 }

extension ViewController:UIGestureRecognizerDelegate{
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        return false
    }
}


//1、避免viewController为RootViewController时连续左滑导致页面push卡死现象
//2、当某页面拦截interactivePopGestureRecognizer代理后会导致隐藏导航栏返回按钮的页面也可以通过左滑手势返回,设置以下代码可以拦截手势
override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        self.navigationController?.interactivePopGestureRecognizer?.isEnabled  = false
}

override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.navigationController?.interactivePopGestureRecognizer?.isEnabled  = true
}

相关文章

网友评论

      本文标题:导航栏默认返回按钮事件拦截

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