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

时间:2013-01-05 22:44:31

标签: uiview uiscrollview uipangesturerecognizer

我在一个透明的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中,水龙头也可以完美运行。滚动但不是那么多。滚动视图滚动大约三个点,然后停止(因为我继续使用水平平移。)如果我放开速度,滚动视图然后选择该速度并完成滚动。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

这是一个更适合我的简单解决方案:

在透明的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上方的自己的视图中。

答案 2 :(得分:0)

#import "CustomUiView.h"

@implementation CustomUiView.h

-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event{
    return NO;
}
@end

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