如果它连接的 UIImageView 在 UIScrollView 下,是不是可以让 Tap Gesture Recognizer 工作?

Posted

技术标签:

【中文标题】如果它连接的 UIImageView 在 UIScrollView 下,是不是可以让 Tap Gesture Recognizer 工作?【英文标题】:Is it possible to make Tap Gesture Recognizer work if UIImageView it's connected to is under UIScrollView?如果它连接的 UIImageView 在 UIScrollView 下,是否可以让 Tap Gesture Recognizer 工作? 【发布时间】:2017-03-22 20:57:17 【问题描述】:

请看截图

我有一个带有 Tap Gesture Recognizer 的 UIImageView 连接到它(“Mans body image view”)。当我点击这个 UIImage 时,我希望它调用一个带有颜色的键盘,这样我就可以改变这个男人形象的肤色。

现在它不起作用,因为在 Mans 身体图像视图的顶部,我有 4 个滚动视图,它们负责头发、面部毛发和衣服(上衣和下装)。

有什么方法可以让点击手势识别器(在滚动视图下)对我的点击做出反应?

谢谢

【问题讨论】:

尝试使用 UIGestureRecognizer 的委托 developer.apple.com/reference/uikit/uigesturerecognizerdelegate 并实现其方法,以便滚动视图的手势识别器不会阻止您的点击手势识别器。不幸的是,您可能必须使用自定义 UIScrollView 子类的那些滚动视图实例才能为滚动视图识别器实现这些方法。这是因为只有 UIScrollView 可以作为其手势识别器的代理。 【参考方案1】:

创建一个UIScrollView subclass 并实施

func gesture​Recognizer(UIGesture​Recognizer, should​Recognize​Simultaneously​With:​ UIGesture​Recognizer)

询问代理是否应该允许两个手势识别器同时识别手势。

func gestureRecognizer(_ gestureRecognizer: UIPanGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UISwipeGestureRecognizer) -> Bool 
    return true

或者改用水平 UICollectionView 并实现委托方法didSelectItemAtIndexPath

【讨论】:

我更喜欢 UICollectionView,它是为显示图像集合而创建的,它有适当的方法来处理点击手势。如果您不想重新创建自行车,这是最好的选择;)另外,我建议您阅读文档并比较滚动视图和集合视图(继承自滚动视图)的 API,您将了解差异并做好准备为将来做出这样的决定! 据我了解,带有 Tap 手势识别器的 UIImageView 仍将位于 UICollectionView 下,不是吗? 不,UICollectionView 有这个开箱即用的委托方法 didSelectItemAtIndexPath。 感谢您的帮助。现在玩 UICollectionView。更多问题来了:)

以上是关于如果它连接的 UIImageView 在 UIScrollView 下,是不是可以让 Tap Gesture Recognizer 工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何保持 UIscrollview 框架固定但动态范围

如何让 UIImageView 尊重它的 superview.layer.mask

如何在 UIViewController 的 tableView 顶部添加自定义视图并能够一起滚动

如何用红色绘制 UIImageView 框架

如何使UIImageView适合缩放图像

UIImageView 显示在其父框架之外