Iphone 如何将触摸从UIView传递到UIScrollView
和其他许多类似,我有一个带有NIB文件的视图控制器,它有这样的布局Iphone 如何将触摸从UIView传递到UIScrollView,iphone,objective-c,uiview,uiscrollview,Iphone,Objective C,Uiview,Uiscrollview,和其他许多类似,我有一个带有NIB文件的视图控制器,它有这样的布局 a。UIView(480 x 320)-存储背景图像 b。UIScrollView(480 x 220)-是一个级别选择器滚动视图 c。UIView(480 x 320)-包含前景动画图形 以上三项都是NIB中主视图的子视图。UIView(c)是iPhone屏幕的全尺寸,位于层次结构的顶部。在它上面,我放置了一个角色,它根据视图中的当前触摸位置设置动画。然而问题是,当这个视图接收到触摸时,我无法触摸它下面的滚动视图(b)。我
- a。UIView(480 x 320)-存储背景图像
- b。UIScrollView(480 x 220)-是一个级别选择器滚动视图
- c。UIView(480 x 320)-包含前景动画图形
谢谢,如果是我,我会将scrollView设置为top view的代理。当然,这需要俯视图是
UIView
的自定义子类,因此您可以设置
id delegate;
及
在头文件中。然后将scrollView设置为具有以下内容的委托:
[topView setDelegate:scrollView];
有了它,您就可以在必要时向scrollView发送消息(在您的情况下是触摸事件)。例如,如果您希望发送所有TouchStart事件,您将有:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate touchesBegan:touches withEvent:event];
}
当然,如果您只希望传递某些事件,您可以在方法中设置参数,说明何时调用
[self.delegate..]
或[super..]
。后者将为视图而不是在scrollView中执行操作。我希望这有助于将UIScrollView子类化并覆盖ToucheShouldCancelIncontentView:方法,如下所示:
-(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;
}
以下是一个对我很有效的简单解决方案: 在视图C(UIScrollView上方的前景视图)中,将宽度和高度都设置为0(这样视图从技术上讲不再位于scrollview的顶部),并设置clipsToBounds=no(这样视图C的内容仍然显示在scrollview的顶部)。这对我来说很有魅力
self.viewC.clipsToBounds = NO;
CGRect frame = self.viewC.frame;
self.viewC.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);
请注意,如果视图C包含交互式控件,则它们将不再工作 问题是,在scrollview中没有检测到滑动-我在到达现在的“状态”之前尝试过这种方法。英雄联盟这是一个国家!但是,您确实让我想到了传递动画所需的信息,但没有触摸事件。我会调查的!哈哈,我很清楚那种感觉。但我很高兴这让你想到了解决这个问题的新方法。对于这样的问题,这通常是我的默认设置。基本上,只需设置将事件发送给代理并从那里开始的条件,无论是手势、触摸还是其他方式。如果您需要更多的控制,您可以将scrollView子类化,并从俯视图中采用自定义协议,指定要调用哪些方法以及如何实现它们。我希望这不会让人困惑,但如果你想尝试一下,我会非常乐意帮助你。是的,这当然是一个设计问题——我总是知道当我以一种愚蠢的方式做某事时,因为它“感觉”像是糟糕的编程!谢谢你的建议,没问题。我总是很乐意帮忙。我希望你能很快把一切都安排好。试着添加以下内容:[super touchesbeated:toucheevent:event];还要注意,如果您要覆盖其中一种触摸处理方法,则需要覆盖所有四种:touchsbegind、touchsmoved、touchseended和touchscancelled。非常聪明。帮助我解决了一些问题。如果origin为0,则可以使用CGRectZero,更干净。难道您不能将.userInteractionEnabled改为NO/false吗?可能是因为视图C不是scrollview的子视图,因此不会包含在
ToucheShouldCancelIncontentView
测试中。(我猜这就是为什么有人投票否决了你)
self.viewC.clipsToBounds = NO;
CGRect frame = self.viewC.frame;
self.viewC.frame = CGRectMake(frame.origin.x, frame.origin.y, 0, 0);