与this thread和其他许多类似,我有一个带有NIB文件的视图控制器,它具有这种布局......
上面的所有三个项目都是NIB中主视图的子视图。 UIView(c)是iPhone屏幕的完整大小,位于层次结构之上。在它上面,我放置了一个基于该视图中当前触摸位置动画的角色。然而问题是,在这个视图接收触摸时,我无法触及它下面的ScrollView(b)。我仍然需要使用(c)中的触摸,但之后还需要将相关的触摸/滑动传递到下面的UIScrollView。
任何人都可以建议如何做到这一点?我已经阅读了有关使用hittest的各种帖子,但不想完全抵消这些触摸,我只需要转发它们,以便滚动视图仍能正常工作。
谢谢,
答案 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;
}