美文网首页iOS开发精选iOS 开源库问题iOS 导航栏
iOS 系统返回按钮事件拦截Swift版本

iOS 系统返回按钮事件拦截Swift版本

作者: 韦德460 | 来源:发表于2017-04-22 17:06 被阅读270次

    iOS 系统返回按钮事件拦截OC版本
    系统返回按钮事件拦截

    • 主要实现原理
    // 如果你想使用的optional方法,你必须用@objc标记您的protocol
    public protocol ShouldPopDelegate
    {
        func currentViewControllerShouldPop() -> Bool
    }
    
    extension UIViewController: ShouldPopDelegate
    {
        public func currentViewControllerShouldPop() -> Bool {
            return true
        }
    }
    
    extension UINavigationController: UINavigationBarDelegate
    {
        public func navigationBar(_ navigationBar: UINavigationBar, shouldPop item: UINavigationItem) -> Bool
        {
            var shouldPop = true
            // 看一下当前控制器有没有实现代理方法 currentViewControllerShouldPop
            // 如果实现了,根据当前控制器的代理方法的返回值决定
            // 没过没有实现 shouldPop = YES
            let currentVC = self.topViewController
    //        if (currentVC?.responds(to: #selector(currentViewControllerShouldPop)))! {
            shouldPop = (currentVC?.currentViewControllerShouldPop())!
    //        }
    
            if (shouldPop == true)
            {
                DispatchQueue.main.async {
                    self.popViewController(animated: true)
                }
                // 这里要return, 否则这个方法将会被再次调用
                return true
            }
            else
            {
                // 让系统backIndicator 按钮透明度恢复为1
                for subview in navigationBar.subviews
                {
                    if (0.0 < subview.alpha && subview.alpha < 1.0) {
                        UIView.animate(withDuration: 0.25, animations: { 
                            subview.alpha = 1.0
                        })
                    }
                }
                return false
            }
        }
    }
    
    • 如何使用
    // 如果需要拦截系统返回按钮就重写该方法返回 false
    override func currentViewControllerShouldPop() -> Bool {
        return false
    }
    
    • 如何禁用系统👉右滑返回手势
    override func viewWillAppear(_ animated: Bool) 
    {
        super.viewWillAppear(animated)
        // 为当前控制器禁用👉右滑返回手势
        if (navigationController?.responds(to: NSSelectorFromString("interactivePopGestureRecognizer")))! {
            navigationController?.interactivePopGestureRecognizer?.isEnabled = false
        }
    }
    
    override func viewWillDisappear(_ animated: Bool) 
    {
        super.viewWillDisappear(animated)
        // 为其他控制器开启👉右滑返回手势
        if (navigationController?.responds(to: NSSelectorFromString("interactivePopGestureRecognizer")))! {
            navigationController?.interactivePopGestureRecognizer?.isEnabled = true
        }
    }
    

    demo 下载



    强烈推荐:超简单!!! iOS设置状态栏、导航栏按钮、标题、颜色、透明度,偏移等

    https://github.com/wangrui460/WRNavigationBar
    https://github.com/wangrui460/WRNavigationBar_swift



    欢迎关注我的微博:wangrui460

    相关文章

      网友评论

      • 姑娘丶你命里缺我:另外还有个问题就是在某个页面写好了之后,所有的页面都会有这个事件触发
      • 姑娘丶你命里缺我:楼主,报这个错:Declarations from extensions cannot be overridden yet
        我在视图里写这个方法override func currentViewControllerShouldPop() -> Bool

      本文标题:iOS 系统返回按钮事件拦截Swift版本

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