13

我有 2 个滚动视图,这两个视图都应该垂直滚动。外部滚动视图(红色)包含一个搜索栏和内部滚动视图(蓝色)。内部滚动视图应该无限滚动(它包含图像/项目并具有无限滚动实现)。

我希望这个控制器工作的方式如下:

当我向下滚动时,外部滚动视图应该首先滚动并且搜索栏应该消失(滚动出内容区域)。只有在那之后,内部滚动视图才应该开始滚动。向上滚动时,内部滚动视图应一直滚动到其顶部。只有这样,外部滚动视图才应该接受滚动事件并最终向上滚动以使搜索栏再次可见。

如果我只是将它们嵌套在 IB 中而不进行任何修改,则内部滚动视图会捕获所有滚动事件,并且它会以相反的方式工作。

请记住,我在这里使用内部滚动视图作为简化隐喻。在我的应用程序中,我实际上有一个控件,它有一个带有嵌套表格视图的滚动视图(滚动视图让我水平翻页,表格视图让我垂直滚动)。

在此处输入图像描述

4

6 回答 6

2

如果可以的话,在 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 是您问题的解决方案。

于 2013-04-29T03:01:42.143 回答
1

我给出了一个滚动视图的示例,你必须创建一个滚动视图并根据动态高度和内容大小添加它才能工作。

// .h 文件

@property (nonatomic, strong) UIScrollView *scrlSearch;

// .m 文件 // ViewDidLoad

scrlSearch = [[UIScrollView alloc] init];

// For first scroll screen height was ((total screen height / 100 )* 10% )
// For Second scroll screen height was ((total screen height / 100 )* 90% )
scrlSearch.frame = CGRectMake(0, 0, (YourScreenWidth), (YourScreenHeight));

// YourVIEW = add any view to scrollbar
[scrlSearch addSubview:YourVIEW];

CGSize contentSize = scrlSearch.frame.size;
// YourContentHeight = dynamic content or static content height
contentSize.height = YourContentHeight;

// set the ContentHeight for scrolling
[scrlSearch setContentSize:contentSize];
// add the scrollview into delegate
[scrlSearch setDelegate:self];
于 2013-04-27T09:47:00.480 回答
0

我不确定您拥有并想要实施的结构..

我做了一个测试项目发现这里做了一个测试项目

但是该项目肯定会帮助您一起管理不同的滚动视图..

该应用程序可能并不完美,但会给您一些实现解决方案的想法。

希望能帮助到你..

干杯

于 2013-04-24T08:41:02.343 回答
0

只使用一个 scrollView 并为搜索栏设置 contentInset/contentOffset。沿着这条线的东西:

  UIEdgeInsets oldEdgeInset = [[self scrollView] contentInset];
  CGRect f = [[self searchBar] frame];
  UIEdgeInsets newEdgeInset = UIEdgeInsetsMake(CGRectGetMaxY(f), 0, 0, 0);
  CGPoint offset = [[self scrollView] contentOffset];
  offset.y += oldEdgeInset.top - newEdgeInset.top;
  [[self scrollView] setContentOffset:offset];
  [[self scrollView] setContentInset:newEdgeInset];
  [[self searchBar] setFrame:f];
于 2013-04-20T12:17:32.003 回答
0

为您的最顶层视图(在所有滚动视图之上,在您的视图控制器的视图上)创建一个滑动手势识别器,并使其识别UISwipeGestureRecognizerDirectionUp.

然后,您需要在外部滚动视图滚动时通知您的控制器。向下滚动后,添加手势识别器。当它再次到达顶部时(outerScrollView.contentOffset == (0,0)),移除手势识别器。

手势应该在它存在时“吃掉”所有滑动事件,使您的内部滚动视图不会接收到触摸事件,因此不会滚动

于 2013-04-29T13:33:18.033 回答
0

您应该在外部滚动视图上添加内部滚动视图,但内部滚动视图的“y”位置应该是外部滚动视图集的内容,例如......

innerScrollView.frame = CGRectMake(10, outerScrollView.contentSize.height, 300, 440);

在此之后,您可以在此 innerScrollView 上添加任何视图,您可以为 innerScrollView 设置 contentOffset 等。

最后,您应该增加外部滚动视图的 contentSize。

outerScrollView.contentSize = CGSizeMake(320, innerScrollView.frame.size.height+actualContentSizeOfOuterScroolView);

我觉得对你有帮助!

于 2013-04-25T08:11:20.940 回答