在NSTextView上方更改NSView的NSCursor

Nao*_*Ida 5 macos cocoa swift

我发现了类似的问题(这个),但我的问题似乎与视图层次结构有点联系.

我有一个NSTextView,然后作为兄弟视图,其他几个NSViews.

与上面链接的问题类似,我设置了一个跟踪区域,并将光标应用于:

class CursorChangingView: NSView {
    override func updateTrackingAreas() {
        let trackingArea = NSTrackingArea(rect: 
    }

    override func cursorUpdate(event: NSEvent) {
        NSCursor.arrowCursor().set()
    }
}
Run Code Online (Sandbox Code Playgroud)

它似乎在悬停时起作用,但会立即返回到IBeam Cursor,它是此CursorChangingView下NSTextViews的默认光标.

这是在鼠标悬停在某个NSView上时应用更改光标的正确方法吗?它下面的NSTextView是否覆盖了我的覆盖?

Leo*_*bus 5

您只需要子类化自定义视图,覆盖awakeFromNib方法,为[.mouseMoved,.activeAlways]事件添加自定义跟踪区域:NSTrackingArea Info.无需覆盖resetCursorRects和/或updateTrackingAreas.您只需要覆盖mouseMoved方法并在那里设置所需的光标:

请注意 discardCursorRects方法的说明:

来自文档

您永远不需要直接调用此方法

Xcode 9•Swift 4

import Cocoa

class CursorChangingView: NSView {

    override func awakeFromNib() {

        addTrackingArea(NSTrackingArea(rect: bounds, options: [.activeAlways, .mouseMoved], owner: self, userInfo: nil))

        wantsLayer = true
        layer?.backgroundColor = NSColor.cyan.cgColor
        layer?.borderColor = NSColor.black.cgColor
        layer?.borderWidth = 1
    }

    @objc override func mouseMoved(with theEvent: NSEvent) {
        NSCursor.pointingHand.set()
    }
}
Run Code Online (Sandbox Code Playgroud)

样品