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

Posted

技术标签:

【中文标题】UIControl 子类正在接收“touchesCancelled”而不是“touchesEnded”【英文标题】:UIControl subclass is receiving "touchesCancelled" instead of "touchesEnded" 【发布时间】:2018-09-04 14:23:05 【问题描述】:

在我的项目中,我有一个主视图,我在其中添加了一个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()
    

我遇到的问题是,所有“点击触摸”都会触发以下回调:

touchesBegan touchesCancelled

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

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


一些事实:

如果我从父视图中删除 UITapGestureRecognizer,一切正常; 即使不调用 supers 并覆盖所有 touches 方法,也会调用 touchesCancelled =/; 如果我进行“长按”或“大移动手势”,touchesEnded 被称为 :o。

【问题讨论】:

我认为这个答案可能对您有所帮助:***.com/a/36038660/4981847 【参考方案1】:

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

UIGestureRecognizer 文档说“如果手势识别器识别出它的手势,则视图的剩余触摸将被取消”:

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

属性cancelsTouchesInView(默认为true)决定了识别手势时是否取消触摸:

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

因为轻触识别器识别长触摸和滑动,所以不会干扰它们。它在识别到点击时进行干预。

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

您可以在代码中或在 Interface Builder 中设置该属性(如果您通过在情节提要中拖出手势识别器来添加手势识别器)。

【讨论】:

你好,@PetMorris。非常感谢您的详细回答。它起作用了,touchesEnded() 现在被称为 \o/。但是我现在遇到的问题是两个回调,touchesEnded() 和来自父视图的UITapGestureRecognizer 的一个都被触发了。有什么方法可以只调用UICustomButton`s 回调?谢谢o/ 你必须为你的识别器分配一个代理。查看 UIGestureRecognizerDelegate。它的gestureRecognizer(_:shouldReceive:) 方法返回一个Bool,它说明触摸是否应该由识别器处理。您需要判断触摸的位置,如果它在您的自定义控件的范围内,则从此委托方法返回 false。 非常感谢@PeteMorris 的回复。这就是我所做的。但我想知道是否还有其他方法可以做到这一点。那我会坚持那个解决方案。干杯\o /

以上是关于UIControl 子类正在接收“touchesCancelled”而不是“touchesEnded”的主要内容,如果未能解决你的问题,请参考以下文章

iOS子类化UIControl没有响应

子类 UIControl 来制作自定义选择器

UIControl 子类 - 如何停止触摸事件流?

目标 C:标签文本(UIControl 的子类)未显示在 UITableview 中

UIControl子类-意外地找到nil,同时隐式展开一个可选值

突出显示 UIControl 子类