自定义一个控件,然后监听对应事件。
一般情况下这么写就行
import Cocoa
class CursorBtn: NSButton {
var trackingArea: NSTrackingArea?
override func updateTrackingAreas() {
if trackingArea == nil {
trackingArea = NSTrackingArea(rect: self.bounds,options: [.mouseEnteredAndExited,.activeAlways], owner: self)
addTrackingArea(trackingArea!)
}
}
override func mouseEntered(with event: NSEvent) {
super.mouseEntered(with: event)
DispatchQueue.main.async {
NSCursor.arrow.set()
}
}
override func mouseExited(with event: NSEvent) {
super.mouseExited(with: event)
DispatchQueue.main.async {
NSCursor.pointingHand.set()
}
}
override func removeFromSuperview() {
if trackingArea != nil {
removeTrackingArea(trackingArea!)
}
super.removeFromSuperview()
}
}
但是当父视图是NSTextView的时候,鼠标样式会一直被修改,所以我们这么写
import Cocoa
class CursorBtn: NSButton {
var trackingArea: NSTrackingArea?
override func updateTrackingAreas() {
if trackingArea == nil {
trackingArea = NSTrackingArea(rect: self.bounds,options: [.mouseMoved,.activeAlways], owner: self)
addTrackingArea(trackingArea!)
}
}
override func mouseMoved(with event: NSEvent) {
super.mouseMoved(with: event)
DispatchQueue.main.async {
NSCursor.arrow.set()
}
}
override func removeFromSuperview() {
if trackingArea != nil {
removeTrackingArea(trackingArea!)
}
super.removeFromSuperview()
}
}
注意修改 NSTrackingArea 的 options
NSCursor
要在DispatchQueue.main.async
中设置
NSCursor
有很多样式,可以点进头文件自己选
网友评论