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

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

一般情况下这么写就行

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有很多样式,可以点进头文件自己选

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容