Дополнительный вид в NSCollectionViewItem приостанавливает dragEvent в CollectionViewController - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь реализовать отбрасывание делегатов на NSCollectionViewController и у меня возникают проблемы с использованием пользовательского NSCollectionViewItem с дополнительным представительным слоем, который я добавил в элемент CollectionView. FWIW, Дополнительный вид используется для рисования пунктирной границы для обозначения области перетаскивания.

Событие перетаскивания прекрасно работает с этим collectionItem и всеми другими collectionItems без этого представления, когда оно скрыто, но как только событие перетаскивания происходит поверх этого представления, событие перетаскивания приостанавливается.

Событие перетаскивания возобновляется, как только мышь перетаскивается за пределы вида, но ничего не произойдет, если я отпущу перетаскивание, когда мышь находится над видом.

Я хотел бы знать, что что происходит здесь и как не дать пользовательскому представлению «украсть» событие мыши из CollectionViewContoller.

Метод делегирования в DropViewController

    func collectionView(_ collectionView: NSCollectionView, validateDrop draggingInfo: NSDraggingInfo, proposedIndexPath proposedDropIndexPath: AutoreleasingUnsafeMutablePointer<NSIndexPath>, dropOperation proposedDropOperation: UnsafeMutablePointer<NSCollectionView.DropOperation>) -> NSDragOperation {
        print("1")


        if proposedDropIndexPath.pointee.item <= self.destinationDirectoryArray.count {
            if proposedDropOperation.pointee == NSCollectionView.DropOperation.on {
                return .move
            }
        } else if proposedDropIndexPath.pointee.item == self.destinationDirectoryArray.count {
            //There's some stuff here validating the URL removed for brevity. It works okay when the focus is outside the view, but happy to add back in if helpful

            if proposedDropOperation.pointee == NSCollectionView.DropOperation.on {
                return .move
            }
        }
        return[]
    }

Настройка Представление коллекции

func configureCollectionView() {
    let flowLayout = NSCollectionViewFlowLayout()
    flowLayout.minimumInteritemSpacing = 8.0
    flowLayout.minimumLineSpacing = 8.0

    destinationCollectionView.delegate = self
    destinationCollectionView.dataSource = self
    destinationCollectionView.register(NSNib(nibNamed: "DestinationCollectionItem", bundle: nil), forItemWithIdentifier: directoryItemIdentifier)
    destinationCollectionView.collectionViewLayout = flowLayout
    destinationCollectionView.registerForDraggedTypes([.fileURL])
    destinationCollectionView.setDraggingSourceOperationMask(NSDragOperation.move, forLocal: true)
}

Настройка элемента представления коллекции

    class DestinationCollectionItem: NSCollectionViewItem {

        @IBOutlet weak var backgroundLayer: NSView!


        override func viewDidLoad() {
            super.viewDidLoad()
            self.highlightState = .none
            view.wantsLayer = true
            view.layer?.cornerRadius = 8.0
            backgroundLayer.isHidden = true
        } 

}

Пользовательский вид границы - Примененный пользовательский класс в Xib и ссылка на владельца файла

class BorderedView: NSView {

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)

        let path : NSBezierPath = NSBezierPath(roundedRect: self.bounds, xRadius: 10.0, yRadius: 10.0)
        path.addClip()

        let dashHeight: CGFloat = 2
        let dashLength: CGFloat = 7
        let dashColor: NSColor = .lightGray

        // setup the context
        let currentContext = NSGraphicsContext.current!.cgContext
        currentContext.setLineWidth(dashHeight)
        currentContext.setLineDash(phase: 0, lengths: [dashLength])
        currentContext.setStrokeColor(dashColor.cgColor)

        // draw the dashed path
        let cgPath : CGPath = CGPath(roundedRect: NSRectToCGRect(self.bounds), cornerWidth: 10.0, cornerHeight: 10.0, transform: nil)
        currentContext.addPath(cgPath)
        currentContext.strokePath()
    }

}

1 Ответ

0 голосов
/ 06 февраля 2020

Что ж, я решил это довольно быстро.

Хотя ранее я пытался добавить unregisterDraggedTypes() в backgroundLayer, проблема также возникла на слое изображения. Я применил его как к Image, так и к backgroundLayer, и теперь он работает.

Настройка вида представления коллекции

class DestinationCollectionItem: NSCollectionViewItem {

    @IBOutlet weak var backgroundLayer: NSView!


    override func viewDidLoad() {
        super.viewDidLoad()
        self.highlightState = .none
        view.wantsLayer = true
        view.layer?.cornerRadius = 8.0
        backgroundLayer.isHidden = true
        backgroundLayer.unregisterDraggedTypes()
        self.imageView?.unregisterDraggedTypes()
        self.textField?.unregisterDraggedTypes()
    }

}
...