你能在touchesBegan之后强制取消触摸事件吗?

10
给定一个UIView的特定状态,我希望它在touchesBegan时作出响应,然后取消任何继续从该特定touchesBegan事件开始的touchesMoved/Ended。基本上,当我的UIView子类处于静止状态时,如果被触摸,我想移动一些其他的UIView...然后下次被触摸时,响应链可以正常响应touchesMoved/Ended...是的,我可以在touchesMoved/Ended中检查这个状态,但我想知道是否有一种方法可以在touch事件的中途停止它。
5个回答

1

移除视图层级结构中的视图

这是一篇很老的帖子,没有令人信服的答案,所以我决定添加我的解决方法

使用Xcode 9、Swift 4和iOS 11进行工作时,这些解决方案不会影响触摸操作

self.resignFirstResponder()
self.touchesEnded(touches, with: event)

我找到的解决方法如下: 。
let superview = self.superview
self.removeFromSuperview()
superview?.addSubview(self)

这在仅涉及编程的项目中很容易实现。我没有使用Storyboard视图进行测试。
您需要确保管理视图层次结构,以便在子视图堆栈中恢复视图到相同的位置。我为视图分配标签来管理在superview.subviews数组中的位置。

1
    let fakeTouch:Set<NSObject> = [UITouch()]
    let event     = UIEvent()

    self.touchesEnded(fakeTouch, withEvent: event)

3
请为您的代码添加一些解释,以便未来的用户可以轻松理解。 - Prudhvi

0

我没有尝试过,但我会做一个有根据的猜测。

第一个响应者是当前触摸事件的接收者。因此,停止作为第一个响应者应该可以阻止更多的触摸事件进入。一个新的触摸事件将设置一个新的第一个响应者。

[self resignFirstResponder];

有理有据的猜测是好的,原帖作者测试的工作也可以,但不回应结果并删除或修正您的回答会被扣1分。 - Dan Rosenstark

0
假设您有一个触摸屏,触摸对象始终相同,这意味着您可以使用 == 进行比较。
UITouch *anyTouch = [touches anyObject];
if (anyTouch != self.lastTouch)
     return;

所以,通过在您的UIView子类中存储最后一个UITouch(在示例中我使用一个名为lastTouch的属性),您可以确定要忽略哪些触摸并识别哪些触摸在移动和结束/取消时。不太优雅也不是那么直接,但它让您得到想要的结果。

当然,这可以扩展到多个触摸。


-2
据我所知,UIScrollView能够取消触摸事件。因此,我猜应该有一些方法可以做到这一点。很抱歉我无法提供更精确的解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接