【发布时间】: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