Реализация 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
что я хочу без необходимости изобретать велосипед?
Спасибо!