如何防止传递给UIView的超级视图的触摸事件?

时间:2011-03-07 08:40:14

标签: iphone cocoa-touch uiscrollview

我制作了一个程序,其中包含可以拖动以在屏幕上移动的图片。 我也使用UIScrollView,因为空间大于窗口。 我将UIView子类化为图片视图,以显示图片并处理此类中的触摸。 图片视图作为子视图添加到scrollView。 但现在我有一个问题: 当我拖动图片时,scrollView与图片一起移动。 我想知道是否有办法消耗图片类中的触摸以防止它们传递给superview。

5 个答案:

答案 0 :(得分:6)

您应该将代码放在UIView的“touchesMoved:withEvent:”方法中。如果你的View会自己处理这个事件,那么它不应该冒泡到superview

答案 1 :(得分:3)

冰风的上述评论解决了这个问题:

您可以尝试在UIScrollView中将canCancelContentTouches设置为NO。并在你的UIView中使用图像设置exclusiveTouch为YES - 冰风3月7日14:22

答案 2 :(得分:0)

为什么使用UIScrollView?您拥有自己的滚动图片视图,因此无需使用UIScrollView来处理滚动触摸输入。

相反,为什么你使用自己的滚动图片视图? UIScrollView会处理滚动大小写,因此您可以在UIImageView下放置UIScrollView,除非您自己的视图有其他行为但您可以继承UIImageView或{ {1}}并且您无需自己滚动图片,因为您知道UIView会为您执行此操作。

答案 3 :(得分:0)

我知道这是一个老问题,但我有一个类似的问题和批准的答案(在滚动视图中将canCancelContentTouches设置为falseisExclusiveTouch设置为true在子视图中)对我不起作用。

经过一些实验,我发现在我的子视图中简单地覆盖gestureRecognizerShouldBegin(_:)以返回false解决了问题:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    return false
}

答案 4 :(得分:0)

您需要子类UIScrollView并覆盖touchesShouldCancel

override func touchesShouldCancel(in view: UIView) -> Bool {
    return !(view is MyView) // or whatever your check is
}

作为奖励,您可能希望scrollView.delaysContentTouches = false对自定义控件进行即时响应。