在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 的菜单无法响应willSelectRowAtIndexPathdidSelectRowAtIndexPath 的点击事件

编辑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”

UIAlertController 解雇他的presentingViewController

错误的“presentingViewController”