在presentingViewController中处理点击事件以关闭侧边菜单
Posted
技术标签:
【中文标题】在presentingViewController中处理点击事件以关闭侧边菜单【英文标题】:Handle tap event in presentingViewController to close side menu 【发布时间】:2015-11-02 23:12:13 【问题描述】:我正在使用这个library 来展示一个侧边菜单。我需要通过点击菜单外的任何地方来关闭菜单。
我尝试过的:
1) 处理 viewController 上的点击事件(负责呈现菜单)
结果:点击事件仅在菜单关闭时触发,一旦菜单打开,不再触发点击事件
2) 处理 MenuController 上的点击事件
结果:只接收它自己的菜单的点击事件
3) 使用presentingViewController
呈现菜单时,将点击识别器添加到 ViewController
结果:没有收到事件
这是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
的点击事件
编辑2:
通过实现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
问题解决了,但它是其他优雅的最佳解决方案吗?
【问题讨论】:
【参考方案1】:通过实现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
【讨论】:
以上是关于在presentingViewController中处理点击事件以关闭侧边菜单的主要内容,如果未能解决你的问题,请参考以下文章
presentingViewController 显示为 null
为什么在viewDidLoad中调用presentingViewController返回nil?
为什么在viewDidLoad中调用presentingViewController返回nil?
“GIDSignIn”类型的值没有成员“presentingViewController”