Swift 3 UITapGestureRecognizer没有接收到水龙头

时间:2017-01-05 07:55:18

标签: ios swift uigesturerecognizer

我想在我的一个视图中添加一个手势识别器来检测水龙头, 这是我的代码:

class DateTimeContainer: UIView, UIGestureRecognizerDelegate {
    override func awakeFromNib() {
        let gesture = UITapGestureRecognizer(target: self, action: #selector(self.onTap))
        gesture.delegate = self
        self.addGestureRecognizer(gesture)
    }

    func onTap(_ gestureRecognizer: UITapGestureRecognizer) {
        openDatePicker()
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool {
        if touch.view?.tag != self.datePickerTag && !self.isDatePickerOpen() {
            return true
        }
        return false
    }
}

当我点击我的视图时,代码进入gestureRecognizer shouldReceive方法并输入返回true的条件。

onTap方法永远不会被调用,有人可以告诉我为什么吗?

修改

添加self.isUserInteractionEnabled = true我设法让它运转起来。 但它有一个奇怪的行为:就像它只在主视图中接收到了水龙头而不是在子视图中。 所以为了简单起见,我通过在视图中添加一个按钮并使用:

来解决
self.button?.addTarget(self, action: #selector(onTap), for: .touchUpInside)

4 个答案:

答案 0 :(得分:4)

您可能忘了这样做:

self.isUserInteractionEnabled = true

此外,通常UIViewController子类通常是目标,并包含用于点击手势的方法。

您无需为点击手势设置代理(通常)

答案 1 :(得分:1)

你可以打手势

let recognizer = UITapGestureRecognizer(target: self,action:#selector(self.handleTap(recognizer:)))
userImage.isUserInteractionEnabled = true
    recognizer.delegate = self as? UIGestureRecognizerDelegate
userImage.addGestureRecognizer(recognizer)

方法调用选择器

func handleTap(recognizer:UITapGestureRecognizer) {

           // do your coding here on method 



        }

答案 2 :(得分:0)

尝试编写代码

let gesture = UITapGestureRecognizer(target: self, action: #selector(self.onTap))
        gesture.delegate = self
        self.addGestureRecognizer(gesture)

内的init块内的

不在awakeFromNib()

答案 3 :(得分:0)

我注意到你在UIView上添加手势。因此,在ViewController您已添加此ContainerView的viewDidLoad方法中,添加此行代码。

override func viewDidLoad() {
    super.viewDidLoad()
    self.YourContainerView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(YourCurrentViewController.openDatePicker())))
    self.YourContainerView.isUserInteractionEnabled = true
}

请注意。不要忘记将isUserInteractionEnabled添加到true。