繁体   English   中英

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

[英]how to prevent a touch event passed to a UIView's superview?

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

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

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

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

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

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

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

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

换句话说,为什么你使用自己的滚动图片视图? UIScrollView将处理滚动的情况,所以你可以在UIScrollView下放置一个UIImageView ,除非你自己的视图有一些其他的行为,但是你可以UIImageViewUIView而不需要你自己滚动图片,因为你知道UIScrollView会做它适合你。

您需要子类UIScrollView并覆盖touchesShouldCancel

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

作为奖励,您可能需要scrollView.delaysContentTouches = false以便在自定义控件上进行即时响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM