在自定义UINavigationController中遇到的问题???

自定义UINavigationController为了全局设置leftBarButtonItem样式、设置push时隐藏底部Bar。
第一步:
先继承 UINavigationController,先声明需要设置的隐藏底部的视图控制器数组

let controllerNameArray = ["", "", "", "",""]

override func viewDidLoad() {
    super.viewDidLoad()
    
    // Do any additional setup after loading the view.
    navigationBar.isTranslucent = false
    if responds(to: #selector(getter: interactivePopGestureRecognizer)) {
        interactivePopGestureRecognizer?.delegate = self
        delegate = self
    }
}

第二步:
重写pushViewController的父类方法并设置push时需要隐藏的控制器,并为push后的视图添加返回按钮

 override func pushViewController(_ viewController: UIViewController, animated: Bool) {
    if self.responds(to: #selector(getter:  interactivePopGestureRecognizer)) {
        interactivePopGestureRecognizer?.isEnabled = false
    }
    if controllerNameArray.contains(String(describing: viewController.classForCoder)) == false {
        viewController.hidesBottomBarWhenPushed = true
    }
    super.pushViewController(viewController, animated: animated)
    if viewControllers.first != viewController {
        checkItem(viewController)
    }
}
    func checkItem(_ viewController: UIViewController) {
    viewController.navigationItem.leftBarButtonItem = UIBarButtonItem(image: UIImage.init(imageLiteralResourceName: "backdcopy").imageWithTintColor(color: AppTheme.shared.secondColor!).withRenderingMode(UIImage.RenderingMode.alwaysOriginal), style: UIBarButtonItem.Style.plain, target: self, action: #selector(backSuperiorController))
}

@objc func backSuperiorController() {
    if self.responds(to: #selector(getter: interactivePopGestureRecognizer)) {
        interactivePopGestureRecognizer?.isEnabled = false
    }
    popViewController(animated: true)
}

第三步:
设置代理方法,并实现侧滑返回

extension KJNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
    if responds(to: #selector(getter: interactivePopGestureRecognizer)) {
        interactivePopGestureRecognizer?.isEnabled = true
    }
}}

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

看上去已经准备好了,开始使用的时候并不会出现什么问题,等到测试的时候会偶现界面假死的情况。原因是因为当UIViewController是导航栏的根视图的时候
interactivePopGestureRecognizer仍然是可用的,改进后如下:

extension KJNavigationController: UINavigationControllerDelegate {
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
    if responds(to: #selector(getter: interactivePopGestureRecognizer)) {
        interactivePopGestureRecognizer?.isEnabled = self.viewControllers.count > 1
    }
}}

记录一下

你可能感兴趣的:(在自定义UINavigationController中遇到的问题???)