拦截UIScrollView滚动

时间:2013-06-20 10:55:44

标签: objective-c uitableview uiscrollview

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

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

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

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

enter image description here enter image description here

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

2 个答案:

答案 0 :(得分:1)

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

  • UITcViewView(让我们称之为 innerScrollView )在UIScrollView内部(我们称之为 scrollView )在主视图内部(让我们称之为 view )。
  • 在视图控制器中为 innerScrollView self.innerScrollView)设置一个插座。
  • 将XIB或代码中的退回设置为:scrollView.bounces = YESinnerScrollView.bounces = NO
  • 最初为 innerScrollView 设置滚动禁用。
  • 在代码(viewDidLoad :)中将scrollView.contentSize.height设置为view.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;
       }
    

    }

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

答案 1 :(得分:-1)

好吧,您应该使用以下UIScrollViewDelegate方法

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
   // here perform the action you need
}