Чтобы определить, когда начинается перетаскивание, реализуйте это в контроллере представления коллекции.
- (BOOL) collectionView: ( UICollectionView * ) collectionView
canMoveItemAtIndexPath: ( NSIndexPath * ) indexPath
Это сработает, когда начнется перетаскивание. Затем, чтобы определить, когда он заканчивается, вам нужно создать подкласс UICollectionViewFlowLayout
и реализовать это
// ZZZ!!!
- ( UICollectionViewLayoutInvalidationContext * ) invalidationContextForEndingInteractiveMovementOfItemsToFinalIndexPaths:( NSArray < NSIndexPath * > * ) indexPaths
previousIndexPaths:( NSArray < NSIndexPath * > * ) previousIndexPaths
movementCancelled:( BOOL ) movementCancelled
, НО будьте осторожны. Если бы элемент был перемещен, то обычный
// XXX!!!
- (void) collectionView:( UICollectionView * ) collectionView
moveItemAtIndexPath:( NSIndexPath * ) sourceIndexPath
toIndexPath:( NSIndexPath * ) destinationIndexPath
был бы вызван ДО того, как это будет вызвано. Если предмет не был перемещен, а просто брошен на место, то ХХХ !!! выше называться не буду но ЗЗЗ !!! будет по-прежнему вызываться, поэтому вам нужно реализовать некоторый logi c, чтобы он работал правильно.
Я предлагаю вам установить путь индекса источника при запуске перетаскивания, и всякий раз, когда он обрабатывается, вы устанавливаете его в nil. Затем вы можете проверить это, прежде чем применять перемещение.
Для меня это иногда происходит, когда элемент перетаскивается в соседнюю ячейку (что XXX не вызывается, только ZZZ), но я подозреваю, что это связано с способ, которым я обрабатываю другие аспекты перетаскивания.
РЕДАКТИРОВАТЬ
Просто чтобы прояснить - ZZZ всегда вызывается последним. XXX не всегда вызывается, но если это так, он вызывается перед ZZZ. Так что, возможно, XXX, тогда ZZZ сообщит вам, что перетаскивание закончилось.
PS: Я не использовал drop-делегат (мой совместим с iOS 10), но я думаю, вы сможете передать это своему drop-делегату -активное решение.