Перетаскивание в представлении коллекции фиксированного размера дает сбой, когда автоматическое изменение порядка вынуждает представление коллекции выходить за пределы максимального числа секций - PullRequest
0 голосов
/ 23 декабря 2018

Реальный пример, который я использую, имеет коллекционное представление, представляющее собой две строки прокрутки в стороны бесконечной длины.Когда я перетаскиваю эту коллекцию, автоматическое изменение порядка иногда пытается создать третью строку, что приводит к сбою приложения.

Я собрал минимальный рабочий пример ниже.

Существует ли функция, которая в целом гласит: «Пожалуйста, будьте благоразумны и разработайте способ переупорядочения себя, не выходя за пределы»?В противном случае, как я могу переопределить стандартное поведение перетаскивания, чтобы остановить это?

Заранее спасибо!

анимированный 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)
    }
}

1 Ответ

0 голосов
/ 31 декабря 2018

ОК - в итоге я сделал следующее:

Я настроил несколько параллельных представлений коллекции с одним разделом с отдельными разделами, а не один просмотр коллекции с несколькими разделами.

Немного странно использовать представление коллекции таким образом - но теперь это работает - и с ограничениями, и с перетаскиванием ....

...