因此,我已经能够使用 tapGesture 识别器成功覆盖菜单按钮的默认行为。我有这样的东西
func addMenuButtonLock() {
defaultMenuTapRecognizer = UITapGestureRecognizer(target: self, action: Selector())
defaultMenuTapRecognizer!.allowedPressTypes = [NSNumber(integer: UIPressType.Menu.rawValue)]
self.view.addGestureRecognizer(defaultMenuTapRecognizer!)
}
func removeMenuButtonLock() {
if defaultMenuTapRecognizer != nil {
self.view.removeGestureRecognizer(defaultMenuTapRecognizer!)
defaultMenuTapRecognizer = nil
}
}
override func viewWillAppear(animated: Bool) {
addMenuButtonLock()
super.viewWillAppear(animated)
}
override func viewDidAppear(animated: Bool) {
removeMenuButtonLock()
super.viewDidAppear(animated)
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
addMenuLock()
}
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
removeMenuLock()
}
但似乎在转换和转场期间(如在一个视图控制器被另一个视图控制器替换/覆盖之间的动画中),如果按下菜单按钮,它似乎会退回到将视图控制器从堆栈中弹出的默认设置。我觉得我已经尝试了一切,包括:
- 根本不删除tapgesturerecognizer
- 在调用视图外观函数的超级方法之前调用它们
- 将 Tapgesturerecognizer 添加到底层导航控制器(继承它)
- 覆盖 pressesBegan、pressesCancelled 和 pressesEnded。在这种情况下,它会捕获菜单按下,但尽管我从未调用过他们的超级方法,但视图仍然会弹出。我真的迷路了。