2013-06-20 38 views
1

我有UIScrollView內的UIScrollView和UITableView。截取UIScrollView滾動

我想攔截滾動的UITableView,並只允許滾動,如果超級視圖(UIScrollView)已達到特定contentOffset。

我已經創建了UIScrollView和UITableView的子類,我如何捕獲滾動事件並攔截滾動,而用戶仍在滾動

我想要實現的示例: 如果我向下滾動標題,UITableView將會有一個標題,會摺疊爲原始大小的30%,並保持在頂部可見。在我滾動回到UITableView的頂部之後,我希望頭擴展。換句話說,我想用可以摺疊/展開的標題來擴展UITableView的滾動。

enter image description here enter image description here

可能有更好的方法來做到這一點,我很開放的建議。

+0

如何使用滾動視圖委託方法scrollViewDidScroll:? –

回答

-1

那麼,你應該使用下面的方法UIScrollViewDelegate

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

問題是,當該方法被調用時,視圖已經被滾動,如何禁用僅在一個方向上滾動並將其發送到超級視圖,而不是使用該方法? – David

1

有可能是一個更好的辦法,但這種解決方案是爲我工作。

  • 的UITableView(姑且稱之爲innerScrollView)的UIScrollView內(我們稱之爲滾動視圖)無論內部的主視圖(姑且稱之爲視圖)。
  • 在您的視圖控制器中爲innerScrollView設置插座self.innerScrollView)。
  • 將XIB或代碼中的反彈設爲:scrollView.bounces = YESinnerScrollView.bounces = NO
  • 將滾動設置爲innerScrollView最初禁用。
  • 在代碼中(viewDidLoad :)將scrollView.contentSize.height設置爲view.frame.size.height +您希望消失的標題的70%。調整大小innerScrollView將調整大小的contentView填充到底部。
  • 設置您的視圖控制器爲委託滾動視圖和實施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; 
        } 
    

    }

我剛剛颳起這個快速啓動並進行了測試。這一切似乎都奏效,但可能需要一些改進和調整。無論如何,這應該讓你至少開始。