如何将UIView中的触摸传递给UIScrollView

时间:2011-09-20 16:31:13

标签: iphone objective-c uiview uiscrollview

this thread和其他许多类似,我有一个带有NIB文件的视图控制器,它具有这种布局......

  • 一个。 UIView(480 x 320) - 存储背景图像
  • 湾UIScrollView(480 x 220) - 是一个关卡选择器scrollview
  • ℃。 UIView(480 x 320) - 包含前景动画图形

上面的所有三个项目都是NIB中主视图的子视图。 UIView(c)是iPhone屏幕的完整大小,位于层次结构之上。在它上面,我放置了一个基于该视图中当前触摸位置动画的角色。然而问题是,在这个视图接收触摸时,我无法触及它下面的ScrollView(b)。我仍然需要使用(c)中的触摸,但之后还需要将相关的触摸/滑动传递到下面的UIScrollView。

任何人都可以建议如何做到这一点?我已经阅读了有关使用hittest的各种帖子,但不想完全抵消这些触摸,我只需要转发它们,以便滚动视图仍能正常工作。

谢谢,

3 个答案:

答案 0 :(得分:1)

如果是我,我会将scrollView设置为顶视图的委托。当然,这需要顶视图是UIView的自定义子幻灯片,因此您可以设置

id delegate; 

@property (nonatomic, assign) id delegate;
头文件中的

。然后,您可以将scrollView设置为委托,其中包含

[topView setDelegate:scrollView];

有了这个,您可以在必要时将消息(在您的情况下,触摸事件)发送到scrollView。例如,如果您想发送所有touchBegan事件,那么您将拥有:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self.delegate touchesBegan:touches withEvent:event];
}

当然,如果您只希望传递某些事件,则可以在方法中设置参数,以说明何时调用[self.delegate ....][super ....]。后者将对视图执行操作,而不是在scrollView中执行操作。我希望这有帮助

答案 1 :(得分:1)

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

在视图C(UIScrollView上方的前景视图)中,使宽度和高度均为0(以便视图不再在技术上位于scrollview的顶部)并设置clipsToBounds = NO(这样的内容视图C仍然显示在滚动视图的顶部)。它对我来说就像一个魅力。

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

请注意,如果视图C包含交互式控件,则它们将不再起作用。

答案 2 :(得分:-1)

子类UIScrollVeiw并覆盖touchesShouldCancelInContentView:方法,如下所示:

-(BOOL)touchesShouldCancelInContentView:(UIView *)view
{

    if ([view isKindOfClass:[UIButton class]]) {//or whatever class you want to override
        return YES;
    }

    if ([view isKindOfClass:[UIControl class]]) {
        return NO;
    }

    return YES;
}