Ячейка UICollectionView привязывается к исходному положению при перетаскивании на iOS 13 - PullRequest
2 голосов
/ 07 января 2020

У меня есть UICollectionViewController, который использует API-интерфейсы интерактивного перемещения для поддержки изменения порядка ячеек. Когда ячейка перетаскивается в другое положение, а затем возвращается в исходное положение, она щелкает / переходит на свое место. Это происходит только на iOS 13 и не происходит на iOS 11 или iOS 12.

https://imgur.com/kKq9xr3

Я использую следующий метод для обработки длинных нажатий ячеек вида коллекции:

@objc private func handleLongPress(_ recognizer: UILongPressGestureRecognizer) {
    switch recognizer.state {
    case .began:
        guard let selectedIndexPath = collectionView.indexPathForItem(at: recognizer.location(in: collectionView)) else {
            break
        }
        collectionView.beginInteractiveMovementForItem(at: selectedIndexPath)

    case .changed:
        collectionView.updateInteractiveMovementTargetPosition(recognizer.location(in: collectionView))

    case .ended:
        collectionView.endInteractiveMovement()

    default:
        collectionView.cancelInteractiveMovement()
    }
}

Здесь доступен минимальный воспроизводимый пример: https://github.com/wsun/ios13DragDrop

Я хотел бы придерживаться интерактивного API-интерфейсы перемещения вместо использования более нового iOS 11 API-интерфейса перетаскивания, поскольку он позволяет контролировать, куда пользователь может перетаскивать ячейки. Поскольку я не делаю ничего особенно нового, я подозреваю, что это может быть регрессия UIKit в iOS 13. У кого-нибудь есть какие-либо предложения или обходные пути для решения этой проблемы?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Немного повозившись, я решил опередить go и реализовать свой собственный API перемещения представлений коллекции, который отражает методы beginInteractiveMovementForItem, updateInteractiveMovementTargetPosition и endInteractiveMovement.

. SO answer полезно проиллюстрировал тип внутренней логики c, которую вам пришлось бы повторно реализовать, и, если это необходимо, вам нужно будет реализовать прокрутку в ячейках перетаскивания и заполнителях. В частности, вы создадите снимок перетаскиваемой ячейки (временно скрывая исходную ячейку) и обновите положение / стиль ячейки временного снимка при ее перетаскивании.

Это куча работы, которую Apple в основном уже позаботился, так что если вам абсолютно не нужен контроль над поведением перетаскивания или свопинга, определенно рекомендую вместо этого использовать iOS 11 API перетаскивания (упомянутый @trapper).

Я обнаружил, что кто-то еще, похоже, подал радар относительно этого поведения, так что, надеюсь, Apple когда-нибудь заметит и исправит!

0 голосов
/ 07 января 2020

Поскольку iOS11 drag and drop встроен в CollectionViews, вам больше не нужно это делать.

https://developer.apple.com/documentation/uikit/views_and_controls/collection_views/supporting_drag_and_drop_in_collection_views

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