我的解决方案如下:
首先:
在您的应用程序中(无论您在何处输入此代码)添加UINavigationBar 的扩展名,如下所示:
以下代码只是在点击navigationBar 时发送带有点和事件的通知。
extension UINavigationBar {
open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "tapNavigationBar"), object: nil, userInfo: ["point": point, "event": event as Any])
return super.hitTest(point, with: event)
}
}
然后在您的特定视图控制器中,您必须通过在 viewDidLoad 中添加此行来收听此通知:
NotificationCenter.default.addObserver(self, selector: #selector(tapNavigationBar), name: NSNotification.Name(rawValue: "tapNavigationBar"), object: nil)
然后你需要在你的视图控制器中创建方法tapNavigationBar:
func tapNavigationBar(notification: Notification) {
let pointOpt = notification.userInfo?["point"] as? CGPoint
let eventOpt = notification.userInfo?["event"] as? UIEvent?
guard let point = pointOpt, let event = eventOpt else { return }
let convertedPoint = YOUR_VIEW_BEHIND_THE_NAVBAR.convert(point, from: self.navigationController?.navigationBar)
if YOUR_VIEW_BEHIND_THE_NAVBAR.point(inside: convertedPoint, with: event) {
//Dispatch whatever you wanted at the first place.
}
}
PD:不要忘记像这样删除 deinit 中的观察:
deinit {
NotificationCenter.default.removeObserver(self)
}
就是这样...这有点“棘手”,但它是一个很好的解决方法,它可以避免在navigationBar 被点击时获取通知。