ios – 嵌套UIScrollViews和事件路由

我有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是您的问题的解决方案.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...