【问题标题】:Propagate dragging touch to UIScrollView superview将拖动触摸传播到 UIScrollView 超级视图
【发布时间】:2012-11-12 16:47:54
【问题描述】:

我一直在这里寻找所有其他类似的主题,使用 UIGestureRecognizers、使用 hitTest:withEvent、pointInside:withEvent: 等,但对于我需要实现的目标似乎没有任何问题。

基本上我有一个主视图(一个普通 UIViewController 的 self.view)和一个小矩形 UIScrollView 附加到它的底部:scrollView 填充了一些 UIImageViews,用户可以像往常一样滚动它。

但是用户还应该能够将一个 UIImageView(或它的副本)从 UIScrollView 拖动到主视图,而且,这是我发现非常困难的,使用相同的拖动手势,因此我需要一个方法:

1) 区分正常的水平滚动手势(应该由 UIScrollView 以通常的方式处理)和图像视图上的拖动手势。

2) 一旦识别出拖动手势,应将触摸传播到超级视图,该超级视图将承载 UIImageView 的副本,并使用相同的拖动手势继续在主视图上拖动,即使超出 UIScrollView 的范围。

请注意,我知道如果 UIScrollView 具有 userInteractionEnabled = NO,则触摸会传播到子视图,但是 1)我想将其传播到父视图而不是子视图,2)userInteractionEnabled 属性显然只有在初始手势已终止,而我需要使用单个拖动手势。

非常感谢您的帮助。

【问题讨论】:

  • 你必须禁用默认启用的delayContentTouches,这是一回事。
  • 您的意思是让 userInteractionEnabled = NO 立即激活?很高兴知道,并不能解决整个问题,但可能会有所帮助,非常感谢。
  • 我没有提到userInteractionEnabled = NO,实际上应该是YES。至于拖动,当您的检测平移手势开始在其上时,您创建或重新定位对象到超级视图以进行拖动;当检测到手势结束时,将其放入具有适当坐标的适当子视图中。
  • 对象的最终位置是superview,并且当拖动发生时,对象应该出现在superview上。实际上,拖动触摸应该只被滚动视图检测到,但会立即“转移”到超级视图,超级视图会立即创建对象的副本(而滚动视图上的对象将被删除)并对其进行拖动操作。希望现在更清楚了。我现在不明白 delayContentTouches 可以为我做什么,既然你更了解我的目标,你能再解释一下吗?谢谢。
  • delayContentTouches 设置为NO 将允许对象在触摸事件发生时立即捕获它(否则,滚动视图将吸收触摸)。其余的可以按照我的描述完成。请注意,滚动视图内的视图将检测到触摸,您将相应地修改视图的坐标。 (使用您触摸并移动的视图,同时在其下创建一个新视图)。

标签: ios uiscrollview uigesturerecognizer superview


【解决方案1】:

所以,到目前为止,我最终实现了 UIScrollView 子类的 touchesShouldBegin:withEvent:inContentView: 方法,但 @nhahtdh 建议将 delayContentTouches 设置为 YES(默认)而不是 NO。

奇怪的是,即使只实现该方法也足以让我的子视图拦截拖动,并且我的滚动视图仍然正常滚动,而 delayContentTouches 设置为 NO 我无法滚动它,因为所有子视图都开始四处移动.

这真的归功于@nhahtdh,所以伙计,如果您发布答案我会接受,非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-27
    • 2023-04-01
    • 1970-01-01
    • 2012-03-17
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多