UIPanGestureRecognizer 不适用于 UIControlEvents

Posted

技术标签:

【中文标题】UIPanGestureRecognizer 不适用于 UIControlEvents【英文标题】:UIPanGestureRecognizer not working with UIControlEvents 【发布时间】:2017-07-26 06:23:50 【问题描述】:

我制作了一个自定义 UIControl,它使用 UIControlEvents 来识别某些交互。一切都很好。现在我还希望我的 UIControl 能够识别UIPanGestureRecognizer,这是代码

fieldView.addTarget(self, action: #selector(willSelectField(sender:)), for: .touchDown)
fieldView.addTarget(self, action: #selector(didSelectField(sender:)), for: .touchUpInside)
fieldView.addTarget(self, action: #selector(canceledFieldSelection(sender:)), for: .touchUpOutside)
fieldView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(draggingField(gesture:))))

所以当我点击我的 fieldView(自定义 UIControl)touchDown 时将被识别。如果我不开始平移,touchUpInsidetouchUpOutside 也会被识别。但如果我平移,例如放开我的 fieldViewtouchUpOutside 将不会被触发。


注意:touchDragInside 不是替代品,因为它只能识别大约 100 像素范围内的拖动。

【问题讨论】:

【参考方案1】:

见reference:

如果手势识别器识别出它的手势,则视图的剩余触摸将被取消。

您可以尝试将cancelsTouchesInView 设置为false,或在您的视图中覆盖touchesCancelled(_:with:)

【讨论】:

我试过了,但 touchesCancelled 方法不会被调用,我也找不到区分 touchUpInsidetouchUpOutside 的方法 添加 cancelsTouchesInView 对我有用。我有一个 UIControl 子类,并且正在使用 UIPanGesture/UILongPressGesture 组合来驱动 sendAction(...)。我在两个 GR 上都设置了该属性

以上是关于UIPanGestureRecognizer 不适用于 UIControlEvents的主要内容,如果未能解决你的问题,请参考以下文章

在 UIButtons 上禁用 UIPanGestureRecognizer

UIPanGestureRecognizer 碰撞

如何在父视图中限制 UIPanGestureRecognizer

UIPanGestureRecognizer 干扰滚动

未调用 iOS 13 UIPanGestureRecognizer 选择器

Swift:获取 UIPanGestureRecognizer 的目标