我正在尝试为我继承的所有视图控制器创建一个基本视图控制器。此基本视图控制器有一个navigationController,其中rightBarButtonItem是一个按钮,在整个视图的顶部显示一个菜单(menuButtonView)。 menuButtonView 控制菜单的所有功能(显示,解除等)
我将NavigationItem.rightBarButtonItem设置为viewDidLoad中名为 menuButtonView 的自定义UIView:
let menuButtonView = NavigationMenuButton()
menuButtonView.delegate = self
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: menuButtonView)
委托是一个简单的协议,有一个函数来处理选择的菜单项。它基本上只处理导航到的位置。
我的 menuButtonView 非常简单,该类处理背景和菜单项的菜单显示,解除和操作。初始化 menuButtonView 时,会设置如下背景视图:
backgroundView = UIView(frame: UIScreen.main.bounds)
backgroundView.backgroundColor = UIColor.black
backgroundView.alpha = 0.0
backgroundView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(backgroundSelected(_:))))
backgroundView.isUserInteractionEnabled = true
它还设置菜单项:
let logoutItem = NavigationMenuItem(title: "Log out", withSize: itemSize)
logoutItem.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.menuItemSelected(_:))))
logoutItem.tag = 2
self.openedFrame = CGRect(x....)
self.items.append(logoutItem)
选择菜单按钮后,它将运行此功能:
func open() {
UIApplication.shared.keyWindow?.rootViewController?.view.addSubview(backgroundView)
UIView.animate(withDuration: 0.3, animations: {
self.backgroundView.alpha = 0.75
for item in self.items {
UIApplication.shared.keyWindow?.rootViewController?.view.addSubview(item)
item.frame = item.openFrame
item.alpha = 1.0
}
})
self.isOpen = true
}
然而,错误发生在背景和menuItems' tapGestureRecognizers ...当我点击背景时,没有任何反应,backgroundSelected
函数永远不会被触发。但是当我点击menuItem时,menuItemSelected
和backgroundSelected
函数都会被触发?初始化 menuButtonView 和调用我所做的open()
函数之间没有任何内容可以改变背景或menuButtonItems的状态。
当选择menuButtonItem时,我会调用一个协议函数来提醒委托者选择了menuButtonItem,以便viewController可以处理该动作,但这不应该影响tapGestureRecognizers。
打开菜单后,我甚至打印出每个项目的tapGestureRecognizer,背景和所有日志都符合它们的要求(每个项目都有一个识别器,目标为menuButtonSelected
,背景有一个具有目标backgroundSelected
)的识别器。但是当我实际点击背景时,没有任何反应,当我点击一个菜单项时,menuButtonSelected
和backgroundSelected
函数都会被触发......
这可能是UITapGestureRecognizer中的错误,还是我没有正确设置tapGestureRecognizers?