修复UIScrollView以将事件向上传递到链而不是向下传递

时间:2010-06-26 17:19:22

标签: iphone uiview uiviewcontroller uiscrollview

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

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

UISV决定事件是否为自己,如果不是,则将其传递给DOWN(进入其子视图);如果他们不处理这个事件,UISV就会抛弃它。这就是错误。

在这种情况下,它应该将它们放回到它自己的父视图 - 最终是父UIVC。 AFAICT,这就是为什么这么多人感到困惑的原因:它没有按照记录的方式工作(注意:因为观点被记录在案; UISV在此问题上只是“未记录” - 它没有声明它的目的是什么做这种情况)。

所以...这个bug有一个简单的解决方法吗?是否有我可以编写的类别可以修复UISV 一般并避免我必须创建“假”UIView子类,它们纯粹是为了捕获事件并将它们交给它们应该去的地方? (这使得容易出错的代码)

特别是来自Apple的文档:

  

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

...如果我可以覆盖“如果计时器触发”方法,并正确实现 ,我相信我可以修复所有的UISV实例。

但:   - 苹果会不会认为这是“使用私有API”(他们对“私有”的描述在正常的编程术语中是荒谬的,我无法理解他们做了什么,也不理解它)   - 有谁知道这种方法是什么,或者找到它的好方法? (调试编译的ObjC类以查找符号名称,也许?)

1 个答案:

答案 0 :(得分:0)

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

iPhone OS 4.0允许您通过UIGestureRecognizer类将侦听器远程添加到给定视图。那太棒了,而且工作得很好。

唯一的问题是...它不适用于任何3.x iPhone和iPod Touch。

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

编辑:

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

NSObject *objectToDelegateToOnTouch;
id touchSourceIdentifier;

每当触摸进来时,视图会直接将touch消息发送到objectToDelegateToOnTouch,但使用touchSourceIdentifier的额外参数。

这样,无论何时触摸,您都知道它来自哪里(您可以使用对象,字符串或任何您想要的“标识符”)。