美文网首页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