iOS 监听导航返回手势

在 iOS 开发中,导航返回手势是一种常见的交互方式,用户可以通过从屏幕左边缘向右滑动来返回上一级页面。在某些情况下,我们可能需要监听这个手势的状态,以便在用户进行返回操作时执行一些自定义逻辑。本文将介绍如何在 iOS 中监听导航返回手势,并提供代码示例供参考。

导航返回手势的原理

在 iOS 中,导航返回手势是由 UINavigationController 管理的。当用户从屏幕左边缘向右滑动时,UINavigationController 会触发一个 interactivePopGestureRecognizer 手势对象,并通过委托方法通知当前视图控制器。

监听导航返回手势的方法

要监听导航返回手势,我们可以通过以下几种方法实现:

方法一:通过委托方法

UINavigationController 提供了一个委托方法 navigationController(_:willShow:animated:),它会在导航控制器显示新的视图控制器之前调用。我们可以在这个方法中监听导航返回手势的状态。

首先,我们需要将当前视图控制器设置为导航控制器的委托对象。可以在 viewDidLoad() 方法中添加以下代码:

override func viewDidLoad() {
    super.viewDidLoad()
    navigationController?.delegate = self
}

然后,实现 navigationController(_:willShow:animated:) 方法,该方法会在导航控制器显示新的视图控制器之前调用。在这个方法中,我们可以通过 interactivePopGestureRecognizer 属性获取导航返回手势对象,并添加手势的状态变化监听。

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if let gestureRecognizer = navigationController.interactivePopGestureRecognizer {
        gestureRecognizer.addTarget(self, action: #selector(handlePopGesture(_:)))
    }
}

@objc func handlePopGesture(_ gestureRecognizer: UIGestureRecognizer) {
    // 手势状态发生变化时的逻辑处理
}

方法二:通过自定义导航控制器

另一种方法是通过自定义导航控制器来监听导航返回手势的状态。我们可以创建一个继承自 UINavigationController 的子类,并重写 interactivePopGestureRecognizer 的 setter 方法,在其中添加手势的状态变化监听。

首先,创建一个继承自 UINavigationController 的子类,例如 CustomNavigationController,并在其中重写 interactivePopGestureRecognizer 的 setter 方法。

class CustomNavigationController: UINavigationController {

    override var interactivePopGestureRecognizer: UIGestureRecognizer? {
        didSet {
            if let gestureRecognizer = interactivePopGestureRecognizer {
                gestureRecognizer.addTarget(self, action: #selector(handlePopGesture(_:)))
            }
        }
    }

    @objc func handlePopGesture(_ gestureRecognizer: UIGestureRecognizer) {
        // 手势状态发生变化时的逻辑处理
    }
}

然后,在使用导航控制器的地方,将其替换为 CustomNavigationController。

let navigationController = CustomNavigationController(rootViewController: rootViewController)

示例

以下是一个完整的示例代码,演示了如何监听导航返回手势的状态,并在用户进行返回操作时执行自定义逻辑。

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.delegate = self
    }

    func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
        if let gestureRecognizer = navigationController.interactivePopGestureRecognizer {
            gestureRecognizer.addTarget(self, action: #selector(handlePopGesture(_:)))
        }
    }

    @objc func handlePopGesture(_ gestureRecognizer: UIGestureRecognizer) {
        if gestureRecognizer.state == .began {
            // 返回手势开始
            print("返回手势开始")
        } else if gestureRecognizer.state == .changed {
            // 返回手势进行中
            print("返回手势进行中")
        } else if gestureRecognizer.state == .ended {
            // 返回手势结束
            print("返回手势结束")
        }
    }
}

总结

在本文中,我们介绍了如何在 iOS 中监听导航返回手势的状态,并提供了两种方法供参考。无论是通过委托方法还是通过自定义导航控制器,都可以轻松地实