美文网首页
Mac开发-修改鼠标NSCursor在单个控件上的样式

Mac开发-修改鼠标NSCursor在单个控件上的样式

作者: 一天天的啊哈哈 | 来源:发表于2023-03-28 14:26 被阅读0次

自定义一个控件,然后监听对应事件。

一般情况下这么写就行

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()
    }
}

注意修改 NSTrackingAreaoptions
NSCursor要在DispatchQueue.main.async中设置
NSCursor有很多样式,可以点进头文件自己选

相关文章

网友评论

      本文标题:Mac开发-修改鼠标NSCursor在单个控件上的样式

      本文链接:https://www.haomeiwen.com/subject/jyztddtx.html