鉴于我的一个UIViews的某种状态,我希望它响应touchesBegan,然后取消任何进一步的touchesMoved / Ended,继续从特定的touchesBegan事件。
基本上我有一个静止的UIView子类,如果它被触及我想移动其他一些UIViews ...然后下次触及响应者链可以正常响应touchesMoved / Ended ...
是的,我可以在touchesMoved / Ended中检查这个状态,但我想知道是否有办法让中期的触摸事件脱轨。答案 0 :(得分:1)
let fakeTouch:Set<NSObject> = [UITouch()]
let event = UIEvent()
self.touchesEnded(fakeTouch, withEvent: event)
答案 1 :(得分: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
数组
答案 2 :(得分:0)
我没有尝试过,但我采取了有根据的猜测。
第一响应者是触摸事件的当前接收者。因此,作为第一响应者辞职应该会阻止更多的触摸事件进入。新的降落将设置新的第一响应者。
[self resignFirstResponder];
答案 3 :(得分:0)
假设您只有一次触摸,触摸对象始终相同,这意味着您可以使用==
进行比较
UITouch *anyTouch = [touches anyObject];
if (anyTouch != self.lastTouch)
return;
因此,通过将最后UITouch
存储在UIView
子类中(在示例中我使用名为lastTouch
的属性),您可以确定要忽略哪些触摸以及哪些触摸你想要在移动中识别并结束/取消。不优雅而不直接,但它可以让你达到你想要的。
当然,这可以扩展为多次触摸。
答案 4 :(得分:-2)
据我所知,UIScrollView可以取消触摸。所以我想有一些方法可以做到这一点。对不起,我无法提供更精确的解决方案。