我有一个处理鼠标事件的NSView子类,在这个NSView里面我有一个子视图(它是NSView的另一个子类)。我怎样才能处理两个NSViews的鼠标事件。
我想实现的是下面的目标。
在一个NSView中,我得到了一个字符,当我在该视图中移动鼠标时,该字符就会跟着鼠标旋转,在该视图中还有一些项目,当鼠标悬停在一个项目上时,我想显示一些信息......如何实现这一点?
基本上:两个类接收并响应鼠标悬停。
最佳的祝愿Kristian
我想,你应该用CreateMouse Region来处理鼠标事件,比如鼠标进入,鼠标退出。
参考以下NSView的方法
addTrackingRect : 提供你想捕捉鼠标事件的区域,你会得到以下事件。
鼠标点击
鼠标上移
鼠标输入
鼠标退出
诸如此类
下面是我们在Swift 5中的做法。
class TrackingAreaView: NSView {
private var isMouseOverTheView = false {
didSet {
backgroundColor = isMouseOverTheView ? .red : .green
}
}
private lazy var area = makeTrackingArea()
private var backgroundColor: NSColor? {
didSet {
setNeedsDisplay(bounds)
}
}
init() {
super.init(frame: NSRect()) // Zero frame. Assuming that we are in autolayout environment.
isMouseOverTheView = false
}
required init?(coder: NSCoder) {
fatalError()
}
public override func updateTrackingAreas() {
removeTrackingArea(area)
area = makeTrackingArea()
addTrackingArea(area)
}
public override func mouseEntered(with event: NSEvent) {
isMouseOverTheView = true
}
public override func mouseExited(with event: NSEvent) {
isMouseOverTheView = false
}
private func makeTrackingArea() -> NSTrackingArea {
return NSTrackingArea(rect: bounds, options: [.mouseEnteredAndExited, .activeInKeyWindow], owner: self, userInfo: nil)
}
open override func draw(_ dirtyRect: NSRect) {
if let backgroundColor = backgroundColor {
backgroundColor.setFill()
dirtyRect.fill()
} else {
super.draw(dirtyRect)
}
}
}