停止将触摸事件传播到Swift中后面的视图

停止将触摸事件传播到Swift中后面的视图,swift,events,uikit,touch,uiresponder,Swift,Events,Uikit,Touch,Uiresponder,我有一个滚动视图和一个子视图在里面。如果用户在该子视图中进行了某种触摸,我希望阻止scrollview移动,以便让用户在子视图中完成自己的工作,而不受scrollview移动的干扰。如果未检测到特定触摸,则滚动视图应正常移动 我用原始触摸事件拦截这些手势touchesbreated,touchesMoved。我不使用手势识别器,因为我想识别的手势非常具体,我觉得使用无抽象层识别它们更容易 我知道在看到很多答案后,我可以在后面拿着scrollview的一个参考,如果我检测到这个手势,就停止它的移动

我有一个滚动视图和一个子视图在里面。如果用户在该子视图中进行了某种触摸,我希望阻止scrollview移动,以便让用户在子视图中完成自己的工作,而不受scrollview移动的干扰。如果未检测到特定触摸,则滚动视图应正常移动

我用原始触摸事件拦截这些手势
touchesbreated
touchesMoved
。我不使用手势识别器,因为我想识别的手势非常具体,我觉得使用无抽象层识别它们更容易

我知道在看到很多答案后,我可以在后面拿着scrollview的一个参考,如果我检测到这个手势,就停止它的移动。我正在寻找一个更稳定的解决方案。如果我检测到手势,我想停止事件的传播(到后面的任何视图),而不必在后面保留这些视图的引用

据我所知,iOS中的视图是UIResponder的子类。当UIKit检测到屏幕上有触摸时,它会将事件发送给第一响应者,这通常是最上面的子视图。我的问题是:在
touchesbeated
中,如何告诉UIKit:“不要将事件发送到响应者链中的任何其他以下视图”。如果我能看到scrollview向后移动,UIKit一定已经将事件转发给它(尽管我没有在
touchsbegind
中调用
super

例如,在Android中,
View
类的
onTouchEvent
函数返回bool。false告诉android继续传播事件,true告诉android停止传播。我在iOS中寻找相同的机制:

@Override
public boolean onTouchEvent(MotionEvent e)
{
    return true ; // stops propagation 
}
在Javascript(jQuery)中,有完全相同的机制:

$('#myview').bind('click', function(e) {
    e.stopPropagation() 
})

如何在Swift中实现这一点?

找到了解决方案。这很难理解,所以如果有人遇到同样的问题,我会尽量简化:

正如在另一个SO回答中所述,“原始触摸系统”(
touchesBegen
touchesMoved
)和“手势识别器系统”是互斥的,它们实际上都处于“原始”视图级别,并且是独立的

这意味着,当您拥有一个视图并触摸它时,您有机会通过原始触摸系统的手势识别器系统来处理您的触摸。是否通过重写变量next:UIResponder来重写
next
UIResponder属性?{get{return nil}仅强制UIKit在原始触摸系统中不转发事件,对后面视图的手势识别仍会启动,因为它是一个完全分离的系统

在我的例子中,我试图
重写var next:UIResponder?{get{return nil}
:后面的视图的
触摸开始
像预期的那样保持安静,但我仍然可以识别那里的手势

因此,UIScrollView似乎使用手势识别器来处理用户触摸。解决方案是从最上面的视图关闭手势识别器系统,以便手势不会被转发:这可以通过以下方式完成:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool 
{
    return !yourConditionToShutDownGR
}

我很困惑,因为Android的手势“检测器”系统是建立在原始触摸系统之上的。当您在
公共布尔onTouchEvent(MotionEvent事件)
中捕捉到触摸事件时,可以将其作为手势检测器的参数传递,如果它找到手势或未找到手势,就会返回。对于iOS来说,这与在原始触摸系统之外构建手势识别器系统的方法不同。

设置为false如何?这是UIScrollView的一个属性。。我一直在寻找一个更稳定的解决方案,而不是持有我想隐藏的观点的参考。明确地说:我希望uiscrollview甚至不知道触摸事件(并且在检测到触摸后不取消移动)我没有尝试过这一点,但是覆盖自定义视图的
next
属性怎么样,该属性应该返回下一个响应者,检测到手势时是否返回
nil
?是否尝试了
override var next:UIResponder?{get{return nil}}
在我的子视图中,但scrollview仍在后面:/Found the solution(发布在我的答案中):)