在presentViewController中处理tap事件以关闭侧边菜单

时间:2015-11-02 23:12:14

标签: ios uitableview swift2 uitapgesturerecognizer

我使用此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

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
}

问题已经解决,但它是否是其他优雅解决方案的最佳解决方案?

1 个答案:

答案 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
    }