2017-09-27 107 views
1

我有一個具有拖放委託(iOS 11)的UITableView。在我的執行UITableViewDropCoordinator拖放(_:toRowAt :)不會執行動畫

func tableView(_ tableView: UITableView, 
    performDropWith coord: UITableViewDropCoordinator) { 

...我打電話給協調員的drop(_:toRowAt:)。根據蘋果公司的說法,這應該會導致拖動項目預覽動畫以精確覆蓋單元格。但是這種事情沒有發生。拖動項目預覽正在縮小,就好像我根本不打電話drop(_:toRowAt:)

這個命令實際上是什麼東西?

回答

0

UITableViewDropCoordinator drop(_:toRowAt:)實際上工作,但只在非常有限的一些情況下。這裏是你有什麼瞭解:

  • drop(_:toRowAt:)必須在performDropWith實現的主要部分被稱爲 - 而不是內部的異步調用loadObject。對於所有的UITableViewDropCoordinator drop命令都是如此。

  • drop(_:toRowAt:)是這樣工作的:

    1. 首先,它快照在給定行的單元格。

    2. 然後,它將該快照替換爲拖動項目預覽,並將快照動畫化以覆蓋該行的單元格。

因此,drop(_:toRowAt:)僅在非常有限的情況下是有用的。當你發出這個命令時,如果有問題的單元由於丟棄而改變它的外觀,單元必須重新加載 - 因爲快照將對應於當前單元的狀態drop命令已給出,並且您不希望單元格的舊的外觀在預覽中動畫化。

由於這個原因,drop(_:toRowAt:)對於loadObject沒有用。 (這是佔位符的用途。)僅在本地拖動時纔有用,您可以從拖動項目的localObject中立即獲取數據。只有在簡單的情況下,您可以將放到現有的電池上,替換爲

例子:

guard let s = item.localObject as? String else {return} 
// ... update model using s ... 
tableView.reloadRows(at: [ip], with: .none) 
coordinator.drop(item, toRowAt: ip) 

請注意,我沒有通話performBatchUpdatesdrop(_:toRowAt:)不適用於performBatchUpdates,因爲快照會過早。它只適用於這種非常有限的簡單情況。

(在關於此主題的WWDC視頻中,Apple似乎暗示drop(_:toRowAt:)在某種程度上對應於. insertAtDestinationIndexPath的下降意圖。但這是不是真的。您不能刪除您即將插入的單元格的快照,因爲您尚未插入它。再次,這就是佔位符的用途。)