Iphone 修复UIScrollView以向上而不是向下传递事件

Iphone 修复UIScrollView以向上而不是向下传递事件,iphone,uiview,uiviewcontroller,uiscrollview,Iphone,Uiview,Uiviewcontroller,Uiscrollview,不处理事件的UIView会将其传递到链上。默认情况下,这会将它们传递给其父视图,如果未处理(最终)则传递给其父UIViewController UIScrollView打破了这一点(关于“为什么我的应用程序在添加UIScrollView后停止工作?”这一主题有很多问题) UISV决定事件是否为自身,如果不是,则向下传递(到其子视图);如果他们不处理事件,UISV将其丢弃。这就是错误所在 在这种情况下,它应该将它们返回到它自己的父视图——最终是父UIVC.AFAICT,这就是为什么这么多人感到困惑

不处理事件的UIView会将其传递到链上。默认情况下,这会将它们传递给其父视图,如果未处理(最终)则传递给其父UIViewController

UIScrollView打破了这一点(关于“为什么我的应用程序在添加UIScrollView后停止工作?”这一主题有很多问题)

UISV决定事件是否为自身,如果不是,则向下传递(到其子视图);如果他们不处理事件,UISV将其丢弃。这就是错误所在

在这种情况下,它应该将它们返回到它自己的父视图——最终是父UIVC.AFAICT,这就是为什么这么多人感到困惑的原因:它没有按照文档化的方式工作(注意:因为视图被文档化了;UISV在这个问题上只是“未文档化”——它没有声明在这种情况下它的目标是什么)

那么…这个bug有没有一个简单的修复方法?有没有一个我可以编写的类别可以修复UISV,从而避免我创建“假”UIView子类,这些子类的存在纯粹是为了捕获事件并将它们传递到它们应该去的地方?(这就产生了容易出现bug的代码)

特别是苹果的文档:

如果时间触发而位置没有明显变化,则滚动视图会将跟踪事件发送到内容视图的触摸子视图。如果用户在计时器过期之前将手指拖得足够远,则滚动视图会取消子视图中的任何跟踪,并自行执行滚动

…如果我可以重写“如果计时器触发”方法并正确实现它,我相信我可以修复所有UISV实例

但是: 苹果会认为这是“使用私有API”(他们对“私有”的描述在正常编程术语中是无稽之谈的,我不明白他们做了什么,并不意味着它)。
-有人知道这个方法是什么,或者是找到它的好方法吗?(也许是调试编译的ObjC类来找到符号名?

我找到了一个部分答案,这是正确的,但不是100%可用的:(

iPhoneOS4.0允许你通过UIgestureRecognitor类远程添加监听器到给定的视图中。这很好,而且工作灵活

唯一的问题是…它在任何3.x iPhone和iPodtouch上都不起作用

(但如果你的目标是4.0及以上,这是一个简单的方法)

编辑:

在OS 3.x上,我创建了一个具有额外属性的自定义UIView子类:

NSObject *objectToDelegateToOnTouch;
id touchSourceIdentifier;
每当触摸输入时,视图都会将触摸消息直接发送到ObjectToDeleteGateToontTouch,但带有touchSourceIdentifier的额外参数

这样,无论何时你得到一个触摸,你都知道它来自哪里(你可以使用一个对象、一个字符串或任何你想要的东西作为“标识符”)