将触摸信息传递给另一个 UIView 下的 UIScrollView

Posted

技术标签:

【中文标题】将触摸信息传递给另一个 UIView 下的 UIScrollView【英文标题】:Passing touch info to UIScrollView under another UIView 【发布时间】:2013-01-05 22:44:31 【问题描述】:

我在透明的 UIView 下有一个 UIScrollView。我需要将所有平底锅和水龙头转移到滚动视图(仅水平滚动)。常规 UIView 使用 UIPanGestureRecognizer 的子类来跟踪垂直平移 (Subclass found here)。在覆盖视图中,我重写了触摸事件方法以将它们传递给 UIScrollView。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    [super touchesBegan:touches withEvent:event];
    [self.scrollView.panGestureRecognizer touchesBegan:touches withEvent:event];
    [self.scrollView.singleTapGesture touchesBegan:touches withEvent:event];


- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

    [super touchesCancelled:touches withEvent:event];
    [self.scrollView.panGestureRecognizer touchesCancelled:touches withEvent:event];
    [self.scrollView.singleTapGesture touchesCancelled:touches withEvent:event];


- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    [super touchesEnded:touches withEvent:event];
    [self.scrollView.panGestureRecognizer touchesEnded:touches withEvent:event];
    [self.scrollView.singleTapGesture touchesEnded:touches withEvent:event];


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

    [super touchesMoved:touches withEvent:event];
    [self.scrollView.panGestureRecognizer touchesMoved:touches withEvent:event];
    [self.scrollView.singleTapGesture touchesMoved:touches withEvent:event];

叠加视图,垂直平移完美运行。在 UIScrollView 中,水龙头也可以正常工作。滚动虽然不是那么多。滚动视图滚动大约三个点,然后停止(当我继续水平平移时)。如果我以一定速度放开,滚动视图然后会拾取该速度并完成滚动。

导致滚动视图停止滚动然后加快速度的可能问题是什么?

【问题讨论】:

【参考方案1】:

从您发布的代码中,我假设您没有对透明 UIView 做任何事情。那么您为什么不直接设置 userInteractionEnabled = NO; ??

【讨论】:

假设透明视图需要响应至少一种类型的触摸,例如滑动或其他。 嗯...我不知道为什么您的滚动停止并加快速度.. 但我会做的是.. 让我的 UIScrollView 处理所有事件.. 包括透明的滑动UIView 应该处理...并创建一个回调函数,将该事件传递给该 UIView... 还禁用 UIView 上的 userInteractionEnabled .. 所以 UIScrollView 以它应该的方式工作.. nd UIView 将处理它应该处理的唯一事件因为 UIScrollView 会捕获它并将其传递给 UIView...也许您现在回过头来更改它为时已晚。但抱歉,我不知道如何解决您的问题。【参考方案2】:

这里有一个对我很有效的更简单的解决方案:

在透明的 UIView(我们称之为 OverlayView)中,将宽度和高度都设为 0(这样视图在技术上不再位于 UIScrollView 之上)并设置 clipsToBounds = NO(这样 OverlayView 的内容仍然显示在 UIScrollView 的顶部)。

 self.OverlayView.clipsToBounds = NO;
 CGRect frame = self.OverlayView.frame;
 self.OverlayView.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);

请注意,如果 OverlayView 包含交互式控件(如上面的按钮),那么它们将不再起作用。您需要将其移动到 UIScrollView 上方的自己的视图中。

【讨论】:

【参考方案3】:
#import "CustomUiView.h"

@implementation CustomUiView.h

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

@end

您不想交互的视图。 创建自定义 UIView 类并将此自定义视图用作在 pointInside 方法中返回 NO 的顶视图。然后触摸将自动进入地下。在您的情况下,您的透明 UIView 将是 UIView 的 CustomUiView 子类。

【讨论】:

以上是关于将触摸信息传递给另一个 UIView 下的 UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略触摸事件并将它们传递给另一个子视图的 UIControl 对象?

将触摸传递给 UIView

Android:将手势事件传递给另一个视图

使 UIView 接收点击,但将滑动传递给底层视图

将值传递给另一个类

将按下的按钮传递给另一个 View JSON