我目前正在编程一个应用程序,该应用程序包含一个主屏幕视图控制器和一个侧边栏菜单视图,该视图在加载主屏幕时实例化,并在单击汉堡图标时打开。我正在尝试实现这样一个功能,即在菜单打开时单击菜单外部会关闭菜单,并将正常功能恢复到主视图,而主视图在打开菜单时被禁用。我在viewDidLoad()
中实例化了一个UITapGestureRecognizer
,以检测用户何时点击主视图。
let tapRecognizer:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(HomeViewController.handleTap(_:)))
self.tableView.addGestureRecognizer(tapRecognizer)
下面是实现:
func handleTap(sender: UITapGestureRecognizer) {
if menu.isMenuOpen {
menu.showMenu(false)
self.tableView.allowsSelection = false
}
}
但是,点击菜单会关闭菜单,就像点击菜单外一样。此外,因为敲击手势识别器只识别特定的敲击,所以主屏幕上的所有内容都会被禁用。我在iOS 9.3上运行XCode 7.3。图片:带有菜单打开的主视图控制器
您可以实现UIGestureRecognizerDelegate
并设置tapRecognizer.delegate = self
。
然后执行以下方法
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
if (gestureRecognizer == tapRecognizer){
let point = touch.locationInView(self.view)
if CGRectContainsPoint(menuView.frame, point) == true {
return false
}
}
}