我有2个滚动视图,它们都应该垂直滚动.外部滚动视图(红色)包含搜索栏和内部滚动视图(蓝色).内滚动视图应无限滚动(它包含图像/项目,并且具有无限滚动的实现).
我想要这个控制器工作的方式如下:
当我向下滚动时,外滚动视图应该首先滚动,搜索栏应该消失(滚动出内容区域).只有在此之后,内滚动视图应该开始滚动.
当向上滚动时,内滚动视图应该一直滚动到其顶部.只有当外滚动视图才可以滚动事件,最后向上滚动以使搜索栏再次可见.
如果我只是将它们嵌入到IB中,而不需要任何修改,内滚动视图会捕获所有的滚动事件,而其它方式也是如此.
请记住,我使用内部滚动视图作为一个简化的比喻在这里.在我的应用程序中,我实际上有一个控件,它有一个带有嵌套表视图的滚动视图(滚动视图让我水平页面,表视图让我垂直滚动).
解决方法
如果您能够在2个滚动视图上设置一个常见的UIScrollViewDelegate,并执行以下操作:
- (void) scrollViewDidScroll: (UIScrollView*) scrollView { if (scrollView == self.mainScrollView) { /* Handle instances when the main scroll view is already at the bottom */ if ( scrollView.contentOffset.y == scrollView.contentSize.height - scrollView.bounds.size.height) { /* Stop scrolling the main scroll view and start scrolling the * inner scroll view */ self.innerScrollView.scrollEnabled = YES; self.mainScrollView.scrollEnabled = NO; } else { /* Start scrolling the main scroll view and stop scrolling the * inner scroll view */ self.innerScrollView.scrollEnabled = NO; self.mainScrollView.scrollEnabled = YES; } } else if (scrollView == self.innerScrollView) { /* Handle instances when the inner scroll view is already at the top */ if (self.innerScrollView.contentOffset.y == 0) { /* Stop scrolling the inner scroll view and start scrolling the * main scroll view */ self.innerScrollView.scrollEnabled = NO; self.mainScrollView.scrollEnabled = YES; } else { /* Start scrolling the inner scroll view and stop scrolling the * main scroll view */ self.innerScrollView.scrollEnabled = YES; self.mainScrollView.scrollEnabled = NO; } } }
请注意,我还没有测试过,但逻辑可能有点像这样(您设置滚动已启用或禁用用户交互,或某事).很可能这不足以满足您的需求,但我确信一个常见的UIScrollViewDelegate是您的问题的解决方案.