Для меня было следующее решение:
Первое: добавьте в свое приложение (не важно, где вы вводите этот код) расширение для 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
.