嵌套的uiscrollviews和自定义处理事件路由

时间:2015-04-27 16:07:17

标签: ios objective-c uiscrollview

我已经嵌套了UIScrollViews,内部UIScrollView位于外部UIScrollView的第二页。 (即内部的一帧将是CGRectMake(320,0,view.width,view.height))。两个滚动视图仅水平移动。我只想在屏幕上滑动内部滚动视图(即外部滚动视图移动到第二页),直到内部滚动视图到达结尾。一旦内部到达终点,那么我想识别滑动外部的一个。我首先尝试在第二页上设置outerScrollView.scrollEnabled = NO,但内部也没有收到滑动手势。我还尝试将UIScrollView子类化并覆盖hitTest:event以返回内部的UIView,这也没有成功。有没有办法将滑动事件处理到特定视图并阻止其他视图?

1 个答案:

答案 0 :(得分:0)

尝试使用代码here检测滚动视图何时到达内部视图的底部。如果它到达底部,则翻转布尔值(如果用户将滚动视图从底部移开,请记得将其翻转回来!)。如果翻转了布尔值,请使用代码here将触摸传递给superview,并允许水平滚动包含的UIScrollView。如果您在强制滚动时遇到问题,请尝试使用代码here强制滚动。

修改 我刚写了一些代码来测试它。通过限制每个视图可以滚动的方向,我能够按照您的描述使其工作,而不使用我上面提到的大部分内容(更简单)。这是滚动视图的代码:

outer = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
[outer setBackgroundColor:[UIColor redColor]];
[outer setShowsHorizontalScrollIndicator:true];
[outer setShowsVerticalScrollIndicator:false];
[outer setScrollEnabled:true];
[outer setDelegate:self];
[outer setAlwaysBounceHorizontal:true];
[outer setAlwaysBounceVertical:false];
outerContent = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width*2, self.view.bounds.size.height)];
[outerContent setBackgroundColor:[UIColor blueColor]];
[outer addSubview:outerContent];
outer.contentSize = outerContent.frame.size;
[self.view addSubview:outer];

inner = [[UIScrollView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
[inner setBackgroundColor:[UIColor yellowColor]];
[inner setShowsHorizontalScrollIndicator:false];
[inner setShowsVerticalScrollIndicator:true];
[inner setAlwaysBounceHorizontal:false];
[inner setAlwaysBounceVertical:true];
[inner setScrollEnabled:true];
[inner setDelegate:self];
innerContent = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height*2)];
[innerContent setBackgroundColor:[UIColor greenColor]];
inner.contentSize = innerContent.frame.size;
[inner addSubview:innerContent];

[self.outerContent addSubview:inner];

我对视图进行了颜色编码,这样你就可以知道发生了什么。 "内"和"外部"是我在头文件中声明并在类中合成的UIScrollViews。 " innerContent"和" outerContent" UIViews也在头文件中。