在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview

Posted

技术标签:

【中文标题】在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview【英文标题】:Passing touch events to uiimageview within a scrollview added as subview to view 【发布时间】:2012-01-26 13:22:12 【问题描述】:

我在视图中添加了一个滚动视图和图像视图。当我触摸此图像视图时,我的滚动视图会滚动。在我的滚动视图中,有很多单独编写触摸事件的图像视图。

这是视图层次结构

                          View
                            |
                            |
                    -------   --------
                   |                  |
                imageView1         scrollview
                                       |
                                  ...........................
                                  |           |       |.....|
                                 imageviews2

Imageview1 在外观上高于 imagesview2。

当我滚动滚动视图时,无法触摸滚动视图中的某些图像视图,因为它位于视图中的图像视图后面。

我如何将触摸事件传递给 imageviews2,只要它位于 imageview1 后面。

【问题讨论】:

setUserInteractionEnabled:NO for imageView1 ? 很抱歉,无法按照您的指示进行操作,因为当用户触摸滚动视图时我必须滚动。如果我这样做,则无法添加该功能。 如果在 imageView1 上禁用 userInteraction,UIScrollView 上的滚动仍将启用... 我试过这个,当我触摸 imageView1 时,我的滚动视图在此之后停止滚动:( 你能告诉我们你使用的代码吗? 【参考方案1】:

您需要继承 UIView 并覆盖

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

在该子类中跳过 imageView1。

您可能会通过子类化UIImageView 并将 imageView1 实例化为该类的成员,并覆盖 pointInside

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
 return NO; 

【讨论】:

你能用一个例子或其他的东西概括地解释一下吗?【参考方案2】:

不要忘记取消选中滚动视图上的“延迟内容触摸”和“可取消内容触摸”!

【讨论】:

【参考方案3】:

我希望这个答案可能对某人有用。我没有使用 hittest 就完成了。

获取滚动视图中的所有子视图并检查它是否是图像视图并执行以下操作。

使用 [view touchesBegan:touches withEvent:event] 将触摸事件传递给另一个视图;我们也必须在 touchesMoved 和 touchesEnded 中写同样的内容。

谢谢,

笑话

【讨论】:

【参考方案4】:

您需要将触摸事件传递给父视图边界之外的 UIView。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 

    // Convert the point to the target view's coordinate system.
    // The target view isn't necessarily the immediate subview
    CGPoint pointForTargetView = [self.targetView convertPoint:point fromView:self];

    if (CGRectContainsPoint(self.targetView.bounds, pointForTargetView)) 

        // The target view may have its view hierarchy,
        // so call its hitTest method to return the right hit-test view
        return [self.targetView hitTest:pointForTargetView withEvent:event];
    

    return [super hitTest:point withEvent:event];

https://developer.apple.com/library/ios/qa/qa2013/qa1812.html

【讨论】:

以上是关于在作为子视图添加的滚动视图中将触摸事件传递给 uiimageview的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 没有将触摸传递给子视图?

将触摸事件传递给 UICollectionViewCell 内容?

将触摸事件传递给多个选项之一

将触摸事件传递给父视图

如何在iOS中将触摸事件发送到superview?

如何将触摸事件从 ScrollView 子视图传递到它的父视图