由于我使用
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接收到鼠标事件。但是我现在只能收到“鼠标移动”。