【发布时间】:2021-03-07 21:20:25
【问题描述】:
我里面有一个滚动视图和一个子视图。如果用户在该子视图中进行了某种触摸,我想阻止滚动视图移动,以便让用户在子视图中做他们的事情而不会被滚动视图移动所困扰。如果没有检测到某个触摸,则滚动视图应该正常移动。
我使用原始触摸事件touchesBegan、touchesMoved 拦截这些手势。我不使用gestureRecognizers,因为我想识别的手势非常具体,而且我觉得不使用抽象层来识别它们更舒服。
我知道在看到很多关于 SO 的答案后,如果我检测到手势,我可以只保留滚动视图的引用并停止其移动。我正在寻找更稳定的解决方案。如果我检测到手势,我想停止事件的传播(到后面的任何视图),而不必保留任何这些视图的引用。
据我了解,iOS 中的视图是 UIResponder 的子类。当 UIKit 检测到屏幕上的触摸时,它会将事件提供给第一响应者,该响应者通常是最顶层的子视图。我的问题是:在touchesBegan 如何告诉 UIKit:“不要将事件发送到响应者链中的任何其他后续视图”。如果我可以看到滚动视图在后面移动,那么 UIKit 一定已经将事件转发给它(尽管我没有在 touchesBegan 中调用 super)
例如在 Android 中,View 类的 onTouchEvent 函数返回一个布尔值。 false 告诉 android 继续传播事件, true 告诉停止传播。我在 iOS 中寻找同样的机制:
@Override
public boolean onTouchEvent(MotionEvent e)
{
return true ; // stops propagation
}
在 Javascript (jQuery) 中,有完全相同的机制:
$('#myview').bind('click', function(e) {
e.stopPropagation()
})
如何在 Swift 中做到这一点?
【问题讨论】:
-
将this设置为false怎么样?
-
这是 UIScrollView 的一个属性。我一直在寻找一个比持有我想要关闭的视图的引用更稳定的解决方案。明确:我希望 uiscrollview 甚至不知道触摸事件(并且在检测到触摸后不取消移动)
-
我还没有尝试过,但是如何覆盖自定义视图的
next属性,它应该返回下一个响应者,以在检测到手势时返回nil? -
在我的子视图中尝试了
override var next:UIResponder? { get { return nil }},但滚动视图仍然落后:/ -
找到了解决方案(发布在我的答案中):)
标签: swift events uikit touch uiresponder