我有一个scrollview和一个子视图,如果用户在该子视图中进行某种触摸操作,则我想阻止scrollview移动,以便让用户在子视图中完成操作而不会受到scrollview的干扰。如果未检测到特定的触摸操作,则scrollview应该正常移动。
我使用原始触摸事件touchesBegan、touchesMoved来截取这些手势。我不使用gestureRecognizers,因为我想要识别的手势非常具体,我感觉使用没有抽象层更加舒适。
我知道通过查看stackoverflow上的很多答案,我可以仅持有一个对滚动视图的引用并在检测到手势时停止其移动。但我正在寻找一种更稳定的解决方案。我希望如果检测到手势,则停止向后传播事件(到任何视图),而无需持有任何这些后面视图的引用。
据我所知,在iOS中,视图是UIResponder的子类。当UIKit在屏幕上检测到触摸事件时,它将事件发送给第一个响应者,通常是最上面的子视图。我的问题是:在touchesBegan中如何告诉UIKit:“不要将事件发送给响应链中的任何其他后续视图”。如果我能看到scrollview在后面移动,那么UIKit必须已将事件转发给它(尽管我在touchesBegan中没有调用super)。
例如,在Android中,View类的onTouchEvent函数返回一个布尔值。false告诉android继续传播事件,true告诉其停止传播。我正在寻找iOS中相同的机制:
在JavaScript(jQuery)中,有相似的机制:
我使用原始触摸事件touchesBegan、touchesMoved来截取这些手势。我不使用gestureRecognizers,因为我想要识别的手势非常具体,我感觉使用没有抽象层更加舒适。
我知道通过查看stackoverflow上的很多答案,我可以仅持有一个对滚动视图的引用并在检测到手势时停止其移动。但我正在寻找一种更稳定的解决方案。我希望如果检测到手势,则停止向后传播事件(到任何视图),而无需持有任何这些后面视图的引用。
据我所知,在iOS中,视图是UIResponder的子类。当UIKit在屏幕上检测到触摸事件时,它将事件发送给第一个响应者,通常是最上面的子视图。我的问题是:在touchesBegan中如何告诉UIKit:“不要将事件发送给响应链中的任何其他后续视图”。如果我能看到scrollview在后面移动,那么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实现这个功能?
next
属性,该属性应返回下一个响应者,以便在检测到手势时返回nil
。 - Sweeperoverride var next:UIResponder? { get { return nil }}
,但是滚动视图仍然在后面移动 :/ - Jerem Lachkar