如何在 MacOS 中检测当前 NSView 之外的鼠标事件?

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

由于我使用

CALayer's
遮罩属性来绘制和裁剪内容,遮罩的大小就像一个带有10像素边框的
NSView
,我的一些内容比当前的
NSView's
尺寸有10像素大。但是目前鼠标移动事件似乎只在鼠标移动到
NSView
区域时检测到,我正在尝试使用
NSTrackingArea
负原点但似乎不起作用?

有人知道如何检测当前视图外的鼠标移动事件吗?

谢谢,

埃里克

我的问题的更多细节:

我需要在我的视图之外绘制一些内容(在更大的视图内)并检测鼠标 我的内容上的事件,这是我目前的限制,我不能使用更大的视图来绘制我的全部内容,只是将其视为一种特殊类型的阴影,我需要检测阴影上的鼠标事件,所以我使用遮罩来剪辑整个内容。这是我用来苹果面具的代码。边距是我想从我的视图中扩展多少像素。 (直接将此功能应用于 NSView)

    func applyMaskToView(src: NSView, margin: CGFloat) {
    src.wantsLayer = true
    
    let mask = CALayer()
    mask.backgroundColor = NSColor.black.cgColor
    let maskFrame = CGRect(x: -margin,
                           y: -margin,
                           width: src.frame.size.width + 2*margin,
                           height: src.frame.size.height + 2*margin )
    mask.frame = maskFrame
    src.layer?.masksToBounds = false
    src.layer?.mask = mask
    return
}

我用来应用跟踪区域的代码在这里(在 NSView 子类中):

    override func updateTrackingAreas() {

    var trackingArea: NSTrackingArea?

    let options1: NSTrackingArea.Options = [.mouseEnteredAndExited,
                                            .activeAlways, 
                                            .mouseMoved,
                                            .enabledDuringMouseDrag]

    let options2: NSTrackingArea.Options = [options1, .inVisibleRect]

    for area in self.trackingAreas {
        self.removeTrackingArea(area)
    }

    if let activeBound = self.layer?.mask?.frame {
         trackingArea = NSTrackingArea.init(rect: activeBound, options: options1, owner: self, userInfo: nil)
    }
    else {
        trackingArea = NSTrackingArea.init(rect: self.bounds, options: options2, owner: self, userInfo: nil)
    }
    
    self.addTrackingArea(trackingArea!)
    super.updateTrackingAreas()
    
}

如果我不使用tracking area,我将无法在上面代码中提到的margin area接收到鼠标事件。但是我现在只能收到“鼠标移动”。

swift macos nsview appkit
© www.soinside.com 2019 - 2024. All rights reserved.