[英]Mouse over in a NSView subview
我有一个处理鼠标事件的 NSView 子类,在那个 NSView 里面我有一个子视图(它是 NSView 的另一个子类)。 我如何处理两个 NSView 的鼠标事件。
我想要实现的是以下内容:
我得到一个角色的 NSView,当我在该视图内移动鼠标时,角色旋转以跟随鼠标。 里面同样有一些项目,当鼠标悬停在一个项目上时我想显示一些信息......如何实现这一点?
基本上:两个类接收和响应鼠标悬停。
最好的问候克里斯蒂安
我想,您应该使用 CreateMouse Region 并处理鼠标事件,例如 mouseenter ,鼠标退出,
参考下面的 NSView 方法
addTrackingRect :提供 Rect ,您想在该区域捕获鼠标事件,您将获得以下事件,
鼠标按下
鼠标向上
鼠标输入
鼠标退出
等等
以下是我们在 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)
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.