簡體   English   中英

在iOS7中重新排序UICollectionView

[英]Reordering UICollectionView in iOS7

我想構建一個UICollectionView,或使用類似的庫來制作網格視圖,我可以在其中重新排列單元格。 我的應用程序支持iOS 7,不幸的是UICollectionView方法 - (BOOL)beginInteractiveMovementForItemAtIndexPath:(NSIndexPath *)indexPath僅適用於iOS 9及更高版本。

有什么方法可以在iOS7上實現“拖動和重新排序”集合視圖單元格的效果嗎? 謝謝。

好吧,我碰巧碰到了同樣的問題,所以讓我加上我的兩分錢。

為了獲得與UIKit在重新排列細胞時所做的相同的效果,我遵循了下面描述的或多或少類似的方法:

  1. 將長按手勢識別器添加到集合視圖中,這樣您就可以檢測到哪個單元格被輕敲而不會弄亂collectionView:didSelectItemAtIndexPath方法。

  2. 當用戶長按單元格時,獲取該單元格的屏幕截圖,將快照視圖添加到集合視圖中,然后隱藏單元格。 當用戶在屏幕上移動手指時,更新快照的中心以便以編程方式移動它,使其看起來像用戶正在拖動單元格。

  3. 訣竅是決定何時以及如何交換細胞。 當快照移動時,它將與其他單元格相交。 當它發生時,你應該更新你的數據源並調用moveItemAtIndexPath這樣它就會交換原始單元格和快照相交的單元格的位置。

  4. 拖動結束時,從集合視圖中刪除快照並顯示原始單元格。

您可以將這些步驟映射到手勢識別器的狀態,以便我們知道您應該在每個州執行的操作:

  • 開始 :1
  • 改變 :2,3
  • 結束取消失敗 :4

我在我的github帳戶中放了一個示例項目 ,因此您可以下載並使用它。 在這里,我將實現手勢回調:

注意:下面的代碼可能不起作用,因為我丟棄了一些特定於實現的細節。 但它應該表明基本意圖。 請從我的github repo下載完整代碼。

func longPressRecognized(recognizer: UILongPressGestureRecognizer) {
  let location = recognizer.locationInView(collectionView)
  let indexPath = collectionView.indexPathForItemAtPoint(location)

  switch recognizer.state {
    case .Began:
      let cell = collectionView.cellForRowAtIndexPath(indexPath)
      let snapshotView = cell.snapshotViewAfterScreenUpdates(true)
      snapshot.center = cell.center
      collectionView.addSubview(snapshotView)
      cell.contentView.alpha = 0.0 // hides original cell

    case .Changed:
      snapshotView.center = location // will follow user's finger.      
      dataSource.swap(originalCellIndexPath.item, indexPath.item) // swaps data
      collectionView.moveItemAtIndexPath(originalCellIndexPath, toIndexPath: indexPath) // swaps cells
      originalCellIndexPath = indexPath

    default:
      let cell = cellForRowAtIndexPath(originalCellIndexPath)
      cell.contentView.alpha = 1.0
      snapshotView.removeFromSuperview()
  }
}

以下是您將獲得的效果(在iOS 8.4模擬器上錄制)

在此輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM