iOS开发精选iOS 开源库问题iOS 导航栏

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

2017-04-22  本文已影响270人  韦德460

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

上一篇 下一篇

猜你喜欢

热点阅读