UIControl 子类正在接收 "touchesCancelled" 而不是 "touchesEnded"

UIControl subclass is receiving "touchesCancelled" instead of "touchesEnded"

在我的项目中,我有一个主视图,我在其中添加了一个 UITapGestureRecognizer,在这个主视图中,我有一个自定义的子视图 UIControl,我将调用它UICustomButton.

UICustomButton 覆盖了 UIControl 的以下方法:

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        pressAnimation()
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        releaseAnimation()
        listener?.onClick(sender: self)
    }

    override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesCancelled(touches, with: event)
        releaseAnimation()
    }

我遇到的问题是,所有 "click touches" 都在触发以下回调:

touchesEnded 回调没有被调用,有点被忽略了,我不知道为什么。

如何在触摸操作中调用 touchesEnded 而不是 touchesCancelled


一些事实:

这是附加了手势识别器的视图的正确行为。

UIGestureRecognizer 文档说 "If a gesture recognizer recognizes its gesture, the remaining touches for the view are cancelled":

https://developer.apple.com/documentation/uikit/uigesturerecognizer

属性cancelsTouchesInView(默认为true),判断手势识别时是否取消触摸:

https://developer.apple.com/documentation/uikit/uigesturerecognizer/1624218-cancelstouchesinview

因为长按和轻扫不会被点击识别器识别,所以它不会干扰它们。它在识别到点击时进行干预。

如果您将识别器的 cancelsTouchesInView 属性 设置为 false,则不应取消触摸,并且会照常调用 touchesEnded(_:with:) 方法。

您可以在代码或 Interface Builder 中设置 属性(如果您通过将手势识别器拖出到故事板中来添加它)。