NSCollectionViewItem中的其他视图会在CollectionViewController中暂停dragEvent

问题描述 投票:0回答:1

我正在尝试在NSCollectionViewController上实现放置委托,并且使用自定义NSCollectionViewItem以及我添加到CollectionView Item上的附加View层时遇到问题。 FWIW,该附加视图用于绘制虚线边框以指示放置区域。

拖动事件在此collectionItem上以及在没有此视图的所有其他collectionItem处于隐藏状态时都可以正常工作,但是拖动事件发生在该视图顶部时,拖动事件就会暂停。

拖动事件一旦将鼠标拖动到视图之外就将继续,但是如果在鼠标悬停在视图上方的情况下释放拖动,则不会发生任何事情。

我想知道这里发生了什么,以及如何防止自定义视图“窃取” 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()
    }

}
macos cocoa uicollectionview drag-and-drop nscollectionview
1个回答
0
投票

嗯-我很快解决了这个问题。

虽然我以前曾尝试将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()
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.