【问题标题】:Fix UIScrollView to pass events UP the chain rather than DOWN修复 UIScrollView 以将事件向上传递而不是向下传递
【发布时间】:2010-06-26 17:19:22
【问题描述】:

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

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

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

在这种情况下,它应该将它们返回到它自己的父视图 - 并最终返回到父 UIVC。 AFAICT,这就是为什么这么多人感到困惑的原因:它没有像记录的那样工作(注意:因为 views 记录在案;UISV 在这件事上只是“未记录” - 它没有声明它的目标是什么在这种情况下做)。

那么……这个错误有简单的修复方法吗?有没有我可以编写的类别来修复 UISV一般 并避免我不得不创建纯粹为了捕获事件并将它们交给他们应该去的地方的“假” UIView 子类? (这使得代码容易出错)

特别是来自 Apple 的文档:

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

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

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

【问题讨论】:

    标签: iphone uiview uiviewcontroller uiscrollview


    【解决方案1】:

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

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

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

    (但如果您的目标是 4.0 及更高版本,这是一种简单的前进方式)

    编辑:

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

    NSObject *objectToDelegateToOnTouch;
    id touchSourceIdentifier;
    

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-16
      • 2013-11-09
      • 2011-04-13
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多