Реальный пример, который я использую, имеет коллекционное представление, представляющее собой две строки прокрутки в стороны бесконечной длины.Когда я перетаскиваю эту коллекцию, автоматическое изменение порядка иногда пытается создать третью строку, что приводит к сбою приложения.
Я собрал минимальный рабочий пример ниже.
Существует ли функция, которая в целом гласит: «Пожалуйста, будьте благоразумны и разработайте способ переупорядочения себя, не выходя за пределы»?В противном случае, как я могу переопределить стандартное поведение перетаскивания, чтобы остановить это?
Заранее спасибо!
анимированный GIF аварийного завершения по этой ссылке
import UIKit
private let reuseIdentifier = "Cell"
class CustomCollectionViewController: UICollectionViewController {
var counter = 1
override func viewDidLoad() {
super.viewDidLoad()
collectionView.dragDelegate = self
collectionView.dropDelegate = self
collectionView.dragInteractionEnabled = true
}
override func numberOfSections(in collectionView: UICollectionView) -> Int{ return 3
}
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 4 }
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! CustomCollectionViewCell
cell.label.text = String(counter)
counter = counter + 1
return cell
}
}
extension CustomCollectionViewController: UICollectionViewDragDelegate{
func collectionView(_ collectionView: UICollectionView, itemsForBeginning session: UIDragSession, at indexPath: IndexPath) -> [UIDragItem]
{
let cell = self.collectionView.cellForItem(at: indexPath) as! CustomCollectionViewCell
let item = cell.label.text
let itemProvider = NSItemProvider(object: item! as String as NSItemProviderWriting)
let dragItem = UIDragItem(itemProvider: itemProvider)
return [dragItem]
}
}
extension CustomCollectionViewController: UICollectionViewDropDelegate{
public func canHandle(_ session: UIDropSession) -> Bool {
return session.canLoadObjects(ofClass: NSString.self)
}
func collectionView(_ collectionView: UICollectionView, dropSessionDidUpdate session: UIDropSession, withDestinationIndexPath destinationIndexPath: IndexPath?) -> UICollectionViewDropProposal {
if collectionView.hasActiveDrag{
if session.items.count > 1 {
return UICollectionViewDropProposal(operation: .cancel)
}
else{
return UICollectionViewDropProposal(operation: .move, intent: .insertAtDestinationIndexPath)
}
}
else{
return UICollectionViewDropProposal(operation: .copy, intent: .insertAtDestinationIndexPath)
}
}
func collectionView(_ collectionView: UICollectionView, performDropWith coordinator: UICollectionViewDropCoordinator) {
let destinationIndexPath: IndexPath
if let indexPath = coordinator.destinationIndexPath{
destinationIndexPath = indexPath
}
else{
destinationIndexPath = IndexPath(row: 0, section: 0)
}
self.collectionView.moveItem(at: (coordinator.items.first?.sourceIndexPath)!, to: destinationIndexPath)
}
}