1

我在 UIScrollView 中有一个 UIScrollView 和一个 UITableView。

我想拦截 UITableView 的滚动,并且仅在超级视图(UIScrollView)达到特定 contentOffset 时才允许滚动。

我已经创建了 UIScrollView 和 UITableView 的子类,如何在用户仍在滚动时捕获滚动事件并拦截滚动

我要完成的示例: UITableView 将有一个标题,如果我向下滚动标题将折叠到原始大小的 30% 并保持在顶部可见。在我滚动回 UITableView 的顶部后,我希望标题展开。换句话说,我想使用可以折叠/展开的标题来扩展 UITableView 的滚动。

在此处输入图像描述 在此处输入图像描述

可能有更好的方法来实现这一点,我愿意接受建议。

4

2 回答 2

1

可能有更好的方法,但这个解决方案对我有用。

  • UITableView(我们称之为innerScrollView)在 UIScrollView (我们称之为scrollView)内无论主视图是什么(我们称之为view)。
  • 在视图控制器中为innerScrollView ( self.innerScrollView) 设置一个出口。
  • 将 XIB 或代码中的反弹设置为:scrollView.bounces = YESinnerScrollView.bounces = NO.
  • 最初将innerScrollView的滚动设置为禁用。
  • 在代码中 (viewDidLoad:) 设置scrollView.contentSize.heightview.frame.size.height+ 70% 的标题要消失。调整innerScrollView的大小以将调整后的 contentView 填充到底部。
  • 将您的视图控制器设置为scrollView的委托并实现scrollViewDidScroll:如下:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
       CGFloat maxYOffset = self.scrollView.contentSize.height - self.scrollView.frame.size.height;
       CGFloat minInnerYOffset = self.innerScrollView.contentInset.top;
       CGFloat currentYOffset = scrollView.contentOffset.y;
       CGFloat newYOffsetDelta = currentYOffset - maxYOffset;
       CGFloat currentInnerYOffset = self.innerScrollView.contentOffset.y;
    
       if (scrollView.contentOffset.y >= maxYOffset) {
           self.innerScrollView.scrollEnabled = YES;
           self.scrollView.contentOffset = CGPointMake(0, maxYOffset);
    
           if (currentYOffset != maxYOffset) {
               self.innerScrollView.contentOffset = CGPointMake(0, currentInnerYOffset + newYOffsetDelta);
           }
       }
       else if (currentInnerYOffset > minInnerYOffset) {
           self.scrollView.contentOffset = CGPointMake(0, maxYOffset);
           self.innerScrollView.contentOffset = CGPointMake(0, currentInnerYOffset + newYOffsetDelta);
       }
       else if (currentYOffset < scrollView.contentInset.top) {
           scrollView.contentOffset = CGPointMake(0, scrollView.contentInset.top);
       }
       else {
           self.lowerScrollView.scrollEnabled = NO;
       }
    

    }

我只是把它掀起来并迅速测试它。这一切似乎都有效,但可能需要一些改进和调整。无论如何,这至少应该让你开始。

于 2013-06-27T08:03:51.470 回答
-1

Well, you should use the following UIScrollViewDelegate method

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
   // here perform the action you need
}
于 2013-06-20T11:20:16.417 回答