Итак, это ошибка UIKit.Правильный путь индекса назначения может быть рассчитан следующим образом:
func collectionView(
_ collectionView: UICollectionView,
dropSessionDidUpdate session: UIDropSession,
withDestinationIndexPath destinationIndexPath: IndexPath?)
-> UICollectionViewDropProposal {
// Calculating location in view
let location = session.location(in: collectionView)
var correctDestination: IndexPath?
// Calculate index inside performUsingPresentationValues
collectionView.performUsingPresentationValues {
correctDestination = collectionView.indexPathForItem(at: location)
}
guard let destination = correctDestination else {
return UICollectionViewDropProposal(
operation: .cancel, intent: .unspecified
)
}
// check destination
// ...
}
Чтобы исправить эту ошибку, сначала я попытался использовать комбинацию location(in:)
и indexPathForItem(at:)
.Полученный индексный путь был равен destinationIndexPath
, предоставленному методом делегата.Почему?Мое внимание привлек UIDataSourceTranslating .Это протокол, позволяющий коллекциям и табличным представлениям показывать ячейки-заполнители для перетаскивания без изменения фактического источника данных.И когда взаимодействие перетаскивания заканчивается, заполнители легко удаляются.Итак, я сделал предположение, что
destinationIndexPath
рассчитывается с помощью indexPathForItem(at:)
- Он игнорирует заполнители, созданные UIDataSourceTranslating, что является ошибкой
Затем я попытался обернуть indexPathForItem(at:)
в performUsingPresentationValues(_:)
, и полученный путь индекса был правильным!