iOS UICollectionView Drag-N-Drop - PullRequest
       46

iOS UICollectionView Drag-N-Drop

0 голосов
/ 01 августа 2020

Я использую UICollectionViewDragDelegate и UICollectionViewDropDelegate для реализации функциональности Drag-N-Drop для моего collectionView. Однако я не знаю, как я могу обнаружить следующие действия:

  1. Если пользователь просто поднимает фотографию, но не двигается, а затем отпускает.
  2. Если пользователь перетаскивает ячейку и перемещается, но по-прежнему опускается в исходное положение.

В итоге я обнаружил, что если конечная позиция совпадает с исходной позицией, функция performDropWithCoordinator не будет вызываться. Поэтому я не знаю, как проверить, совпадает ли новая позиция с исходной.

1 Ответ

0 голосов
/ 01 августа 2020

Чтобы определить, когда начинается перетаскивание, реализуйте это в контроллере представления коллекции.

- (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-делегату -активное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...