允许UIScrollView及其子视图都响应触摸

Wil*_*sch 22 uiscrollview touches uigesturerecognizer ios

我希望我的UIScrollView及其子视图能够接收子视图中的所有触摸事件.每个人都可以以自己的方式回应.

或者,如果将点击手势转发到子视图,则一切都会很好.

很多人都在这个一般领域挣扎.以下是许多相关问题中的一些问题:

UIScrollView如何从其子视图
中窃取触摸如何从UIScrollView窃取触摸?
如何取消UIScrollView中的滚动

顺便说一句,如果我在滚动视图中覆盖hitTest:withEvent:,只要userInteractionEnabled为YES,我就会看到触摸.但这并没有真正解决我的问题,因为:

1)那时,我不知道它是否是一个水龙头.
2)有时我需要将userInteractionEnabled设置为NO.

编辑:澄清,是的,我想以不同于平底锅的方式对待水龙头.点击应由子视图处理.可以通过滚动视图以通常的方式处理平移.

Aar*_*man 38

首先,免责声明.如果设置userInteractionEnabledNOon UIScrollView,则不会将触摸事件传递给子视图.据我所知,除了一个例外之外没有办法解决这个问题:拦截超级视图上的触摸事件UIScrollView,并特别将这些事件传递给子视图UIScrollView.说实话,我不知道你为什么要这样做.如果您想要禁用特定的UIScrollView功能(例如......好吧,滚动),您可以轻松地做到这一点,而无需禁用UserInteraction.

如果我理解你的问题,你需要点击事件由UIScrollView处理传递给子视图?在任何情况下(无论手势是什么),我认为你正在寻找的是协议方法gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:在协议中UIGestureRecognizerDelegate.在您的子视图中,无论您拥有什么样的手势识别器,都可以在手势识别器上设置一个委托(可能是UIGestureReconginzer在第一个位置设置的任何类).覆盖上面的方法并返回YES.现在,这个手势将被识别以及可能"偷走"手势的任何其他识别器(在您的情况下,轻击).使用此方法,您甚至可以对代码进行微调,以便仅将某些类型的手势发送到子视图,或仅在某些情况下发送手势.它给你很多控制权.请务必阅读有关该方法的内容,尤其是此部分:

当通过gestureRecognizer或otherGestureRecognizer识别手势将阻止其他手势识别器识别其手势时,调用此方法.请注意,保证返回YES可以同时识别; 另一方面,返回NO不能保证防止同时识别,因为另一个手势识别器的代表可能返回YES.

当然,有一个警告:这仅适用于手势识别器.所以,你仍然可能有问题,如果你想使用touchesBegan:,touchesEnded等来处理触摸.当然,您可以使用hitTest:将原始触摸事件发送到子视图,但为什么?为什么可以使用这些方法处理事件UIView,当您可以将UIGestureRecognizer视图附加到视图并免费获得所有这些功能时?如果您需要以没有标准UIGestureRecognizer可以提供的方式处理的触摸,则子类化 UIGestureRecognizer并处理那里的触摸.这样您就可以获得a的所有功能UIGestureRecognizer以及自己的自定义触摸处理功能.我真的认为Apple打算UIGestureRecognizer替换开发人员使用的大多数(如果不是全部)自定义触摸处理代码UIView.它允许代码重用,并且在减轻哪些代码处理触摸事件时处理起来要容易得多.