Реализация NSCollectionView по умолчанию медленной анимации скопления NSDraggingDestination

Цель

Я хочу воссоздать поведение перетаскивания в MacOS Photos.app: при выборе нескольких элементов для их реорганизации элементы быстро анимируются в виде стопки.

Реализация по умолчанию NSDraggingDestination, предоставляемая NSCollectionView, кажется, имеет несколько проблем:

  • медленная анимация скопления изображений при перетаскивании нескольких элементов и перемещении курсора, а красный значок, указывающий количество элементов, неудобно приближается к курсору (см. рисунок ниже)
  • установка свойства draggingFormation NSDraggingInfo или NSDraggingSession, кажется, не имеет никакого эффекта, где бы я ни устанавливал его

Медленная анимация

Код

Вот как настраивается CollectionView:

override func viewDidLoad() {
    super.viewDidLoad()

    collectionView.dataSource = self
    collectionView.delegate = self

    collectionView.registerForDraggedTypes([.string])
    collectionView.setDraggingSourceOperationMask(.every, forLocal: true)
    collectionView.setDraggingSourceOperationMask(.every, forLocal: false)
}

И это то, что реализовано в делегате:

extension ViewController: NSCollectionViewDelegate {

    // Drag
    func collectionView(_ collectionView: NSCollectionView, pasteboardWriterForItemAt indexPath: IndexPath) -> NSPasteboardWriting? {
        let wallpaperName = wallpapers[indexPath.item].name()?.rawValue ?? "unknown"
        return wallpaperName as NSString
    }

    func collectionView(_ collectionView: NSCollectionView, draggingSession session: NSDraggingSession, willBeginAt screenPoint: NSPoint, forItemsAt indexPaths: Set<IndexPath>) {
        session.draggingFormation = .pile
    }

    // Drop
    func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
        if proposedDropOperation.pointee == .on {
            proposedDropOperation.pointee = .before
        }
        return .move
    }

}

У меня есть пример проекта, демонстрирующий это поведение на github, если вы хотите воспроизвести его или увидеть больше кода: https://github.com/jeanetienne/CollectionViewDragDrop

Помогите

Как я могу иметь плавную анимацию стада, и установить тип draggingFormation что я хочу без необходимости изобретать велосипед?

Спасибо!

0 ответов

Другие вопросы по тегам