2015-02-06 56 views
2

我試圖找出一種方法暫時(即在單個拖動手勢期間)禁用在UITableView上的滾動,然後重新啓用該功能以使其從中斷處繼續。在拖動期間暫時禁用UITableView滾動

我的理由是我有一個手勢識別器監視拖動,如果用戶在桌子上方拖動他們的手指,我想用手指向上調整表格的大小,然後停止調整大小並繼續滾動。當然,我不希望表格在調整大小時滾動,因爲這實際上是實現了滾動本身(通過移動整個表格視圖而不是內部滾動內容),但我無法弄清楚以這樣的方式做到這一點,即允許手勢在特定點之後再次生效(或者如果用戶在桌子上向下拖動)。

有沒有辦法暫時禁用/阻止手勢而不導致它失敗或徹底取消?

也許我可以寫一個UITableView的子類,它可以攔截手勢並根據需要忽略它們。我應該重寫什麼方法來做到這一點?

更新:

最後我以不同的方式,這是簡單地在手勢的每個變化調整表視圖的contentOffset接近這一。我擔心這可能看起來很「緊張」,但它實際上運行得很順利。不過,我會留下這個問題,因爲我仍然好奇這是否可以完成。

+0

我想這個方法'scrollViewWillBeginDragging:'就是你要尋找的。 – 2015-02-10 18:51:26

+0

@AshrafTawfeeq似乎沒有任何方法可以使用滾動視圖委託方法取消滾動。他們只是提供了一個滾動信息。 – devios1 2015-02-10 19:53:31

+0

嗨Devios,你介意分享你的解決方案嗎? 聽起來不錯! – 2016-04-01 18:58:05

回答

0

您可以通過設置禁用UITableView的滾動:

table.scrollEnabled = NO; 

當你不使用你的自定義手勢,啓用它:

table.scrollEnabled = YES; 

這是父類的屬性UIscrollView

如果此屬性的值爲YES,則啓用滾動,如果爲NO,則滾動爲disa放血。默認值是YES。

禁用滾動時,滾動視圖不接受觸摸事件;它將它們轉發給響應者鏈。

+2

這部分工作。問題是在表視圖上重新啓用滾動不會重新激活該手勢。一旦關閉滾動,它將保持無響應,直到下一個手勢。理想情況下,我想找出一些方法來吸收手勢變化(或固定表視圖的滾動位置)一段時間,然後解除它。 – devios1 2015-02-07 19:12:14

1

在@BrunoGalinari的要求,這裏是我的執行處理上一個UITableView全景手勢,而不會破壞表視圖的內在滾動的主要部分。

tableViewExpanded是在兩個佈局狀態(擴展與否)之間切換並適當調整常數的本地屬性。將它設置爲自身只是將約束重新調整爲兩個有效值之一,因爲它在泛中也受到影響。

- (void)handlePan:(UIPanGestureRecognizer*)sender { 
    static CGFloat initialBottomViewY; 
    static CGFloat initialTableViewContentOffsetY; 
    static CGFloat initialTouchPointY; 

    CGPoint touchPoint = [sender locationInView:self.view]; 
    CGFloat splitOffset = touchPoint.y - initialBottomViewY; 

    BOOL inEffect = (sender == self.tableViewPan && touchPoint.y < initialBottomViewY) || (sender == self.mapViewPan && touchPoint.y > initialBottomViewY); 

    switch (sender.state) { 
     case UIGestureRecognizerStateBegan: { 
      initialBottomViewY = self.bottomView.y; 
      initialTableViewContentOffsetY = self.tableView.contentOffset.y; 
      initialTouchPointY = touchPoint.y; 
      break; 
     } 

     case UIGestureRecognizerStateEnded: { 
      self.dragVelocity = [sender velocityInView:self.view].y; 
      if (inEffect) { 
       if (ABS(splitOffset) > 60.f) { // adjust 
        if (sender == self.mapViewPan && touchPoint.y > initialBottomViewY) 
         self.tableViewExpanded = NO; 
        else if (sender == self.tableViewPan && touchPoint.y < initialBottomViewY) 
         self.tableViewExpanded = YES; 
        else 
         self.tableViewExpanded = self.tableViewExpanded; 
       } else 
        self.tableViewExpanded = self.tableViewExpanded; // spring back 
      } 
      break; 
     } 

     case UIGestureRecognizerStateChanged: { 
      if (inEffect) { 
       self.tableView.contentOffset = CGPointMake(self.tableView.contentOffset.x, initialTableViewContentOffsetY + initialTouchPointY - initialBottomViewY); 

       self.bottomViewHeightConstraint.constant = self.view.height - touchPoint.y; 
       self.annotationToSelect = nil; 
       [self adjustMapAnimated:NO]; 
      } 
      break; 
     } 

     default: { 
      break; 
     } 
    } 
} 

這裏的窗口是什麼樣子,得到安置的一個想法:

enter image description here