2014-09-26 101 views
2

我創建了一種網格視圖,您可以在其中添加一些小部件,並按需要通過拖放來重新排列它們。 現在我的網格視圖是一個UIscroll視圖,這些控件是UIview的子類。UIscrollview和拖放

以下是您可以使用的網格的示例 當我拖動窗口小部件時,如果窗口部件接近屏幕底部,我希望能夠使滾動視圖向下。 現在,我的小部件有一個UIPanGestureRecognizer 以下代碼:

func enterDragMode(recognizer:UIPanGestureRecognizer) { 

    if (recognizer.state == UIGestureRecognizerState.Ended) || (recognizer.state == UIGestureRecognizerState.Cancelled) { 
     gridNotificationCenter.postNotificationName("WidgetDragEnded", object: self) 
     // Notify the grid and drop the widget here 
    } else { 
     var translation = recognizer.translationInView(self.superview!) 
     var newPoint = self.center 
     newPoint.x += translation.x 
     newPoint.y += translation.y 

     if (CGRectContainsRect(moveDownRect, self.frame)) { 
      var scrollview = self.superview as? UIScrollView 
      if (scrollview != nil) { 
       // need to find correct visible rect here 
       res!.scrollRectToVisible(visibleRect, animated: true) 
      } 
     } 
     recognizer.setTranslation(CGPointZero, inView: self.superview) 
    } 
} 

,但我覺得我沒有使用正確的類來妥善處理這一點,因爲回調不會被觸發,當我簡單地舉行視圖而不是移動它。有沒有更好的辦法 ?

+0

這個ui集合視圖的尖叫給我。由於它是uiscrollview的子類,它將具有相同的屬性以及佈局的附加優勢。無論如何,我假設這段代碼在widget類中? moveDownRect從哪裏來? – 2014-09-26 08:30:27

+0

MovedownRect是widgetview中的一個常量記錄,而且這段代碼來自widget視圖。我沒有使用collectionview,因爲所有的小部件可能沒有相同的大小,也可以調整自己的大小。 – Loadex 2014-09-26 08:33:38

+0

您是否將滾動視圖的內容大小設置爲大於其框架?它是否達到了設定的內容偏移代碼? – 2014-09-26 08:38:36

回答

2

嘗試在視圖底部附近設置虛擬區域。 平移手勢移動時觸發。如果進入該區域,只要平移手勢不離開該區域並且不結束,就開始向下滾動。

並且只要您在指定區域內,就使用計時器(NSTimer不是CADisplayLink,因爲您無法在刷新視圖時對視圖應用滾動)來增加滾動視圖的大小。