Ios 在presentingViewController中处理点击事件以关闭侧菜单
我用这个来展示一个配菜。我只需点击菜单外的任何地方就可以取消菜单 我所尝试的: 1) 处理viewController上的点击事件(负责显示菜单) 结果:仅当菜单关闭时触发点击事件,菜单打开后不再触发点击事件 2) 在菜单控制器上处理点击事件 结果:只接收菜单中的点击事件 3) 使用Ios 在presentingViewController中处理点击事件以关闭侧菜单,ios,uitableview,swift2,uitapgesturerecognizer,Ios,Uitableview,Swift2,Uitapgesturerecognizer,我用这个来展示一个配菜。我只需点击菜单外的任何地方就可以取消菜单 我所尝试的: 1) 处理viewController上的点击事件(负责显示菜单) 结果:仅当菜单关闭时触发点击事件,菜单打开后不再触发点击事件 2) 在菜单控制器上处理点击事件 结果:只接收菜单中的点击事件 3) 使用presentingViewController 结果:未收到事件 以下是菜单viewcontroller中的代码: private var tapGesture: UITapGestureRecognizer? =
presentingViewController
结果:未收到事件
以下是菜单viewcontroller
中的代码:
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)")
}
我真的很累。无法确定如何在显示菜单后接收菜单外的点击事件
注意:我正在使用
编辑:
通过将点击识别器连接到按键窗口,我能够接收菜单外的点击事件:
tapGesture = UITapGestureRecognizer(target: self, action: "handleTap:")
UIApplication.sharedApplication().keyWindow?.addGestureRecognizer(tapGesture!)
但是现在作为UITableViewController
的菜单无法响应点击事件willSelectRowAtIndexPath
和didSelectRowAtIndexPath
编辑2:
通过实现
UIgestureRecognitizerDelegate的委托方法,我能够解决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
}
问题解决了,但这是其他优雅的解决方案中最好的吗?通过实现uigestureRecognitizerDelegate
的委托方法,我能够解决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
}