我使用此library来显示侧边菜单。我需要通过点击菜单外的任何地方来关闭菜单。
我尝试过:
1)处理viewController上的点击事件(负责显示菜单)
结果:点击事件仅在菜单关闭时触发,一旦菜单打开,则不再点击事件
2)在MenuController上处理点击事件
结果:仅接收自己菜单中的点击事件
3)当使用presentingViewController
结果:没有收到活动
这是MenuViewController
中的代码:
private var tapGesture: UITapGestureRecognizer? = nil
override func viewDidLoad() {
super.viewDidLoad()
if let viewController = self.presentingViewController as? ViewController {
tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
viewController.container.addGestureRecognizer(tapGesture!)
}
}
func handleTap(recognizer: UITapGestureRecognizer){
let location = recognizer.locationInView(view)
print("menu \(location)")
}
我真的堆叠了。无法确定如何在菜单出现后接收点击事件。
注意:我使用swift_2.0 Branch
编辑:
我可以通过将点击识别器附加到关键窗口来接收菜单外的点击事件:
tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
UIApplication.sharedApplication().keyWindow?.addGestureRecognizer(tapGesture!)
但现在,UITableViewController
的菜单无法响应点击事件willSelectRowAtIndexPath
和didSelectRowAtIndexPath
EDIT2:
通过实现UIGestureRecognizerDelegate
的委托方法,我能够解决TableView上的块触摸事件的问题:
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
let location = touch.locationInView(view)
if !CGRectContainsPoint(self.tableView.frame, location){
delegate?.menuDidCancel(self)
}
return false
}
问题已经解决,但它是否是其他优雅解决方案的最佳解决方案?
答案 0 :(得分:0)
我能够通过实现UIGestureRecognizerDelegate
的委托方法来解决TableView上的块触摸事件的问题,如果用户在外面点击则关闭菜单后返回false
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
let location = touch.locationInView(view)
if !CGRectContainsPoint(self.tableView.frame, location){
delegate?.menuDidCancel(self)
}
return false
}