UITapGestureRecognizer响应不正确的UIView

时间:2015-08-08 05:12:08

标签: swift uiview uitapgesturerecognizer

我有一个100x600 UIView位于UIView的主ViewController之上。通常,我想隐藏这个视图。当用户点击几个控件之一(包括主视图)时,我取消隐藏子UIView。点击主UIView上的任意位置都会隐藏它。

在viewDidLoad中,我有以下UITapGestureRecognizer:

    let viewTouch = UITapGestureRecognizer(target: self, action: "viewClicked:")
    self.view.addGestureRecognizer(viewTouch)

viewClicked函数如下所示:

func viewClicked(gestureRecognizer: UIGestureRecognizer) {
    handleDisplayOfDropdownView()
}

handleDisplayOfDropdown函数负责显示和隐藏子UIView。它所做的就是调整子视图的alpha值,使其可见或不可见。

func handleDisplayOfDropdownView() {
    UIView.animateWithDuration(0.5, animations: {
        if !self.dropDownVisible {
            self.dropDownVisible = true
            self.dropDownView.alpha = 1.0
        }
        else {
            self.dropDownVisible = false
            self.dropDownView.alpha = 0
        }
    })
}

所有UI工作都由故事板完成。我只是在ViewController的顶部放置了一个100x600的视图。通过点击主UIView可以看到它并隐藏起来。

我遇到的问题是当我点击它时,子UIView消失了。当我设置UITapGestureRecognizer时,我认为只有点击主UIView才能激活并隐藏它。似乎在任何地方点击,包括子UIView都隐藏它。

我是否错误地设置了UITapGestureRecognizer

1 个答案:

答案 0 :(得分:2)

添加gestureDelegate:

 UIGestureRecognizerDelegate

在ViewDidLoad中设置viewTouch UITapGesture委托:

viewTouch.delegate = self

然后调用此委托

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    let p = touch.locationInView(view)
    if CGRectContainsPoint(dropDownView.frame, p) {
      return false
    }
    return true
  }