使用 NSCursor.push() 或 .set() 更改鼠标光标很快就会再次被箭头光标取代

Changing mouse cursor with NSCursor.push() or .set() is soon replaced by arrow cursor again

提问人:Nickkk 提问时间:10/19/2023 最后编辑:WillekeNickkk 更新时间:10/19/2023 访问量:18

问:

我在 macOS 14 中注意到了一个在 macOS 13 上没有的问题。我曾经能够在鼠标光标移动到应用中的某个视图区域时设置自定义鼠标光标,但现在它会定期重置为标准箭头光标。

这很容易用下面的代码重现。当我将鼠标移入和移出红色矩形时。向内移动时,光标应变为手,向外移动时应再次变为箭头。似乎特别是当将鼠标移动到红色矩形的右侧时,它会迅速重置为箭头光标,而在左侧移动鼠标时,它通常会停留一只手。

即使取消注释行,也会使鼠标光标在箭头和手之间闪烁。cursor?.set()

这是一个已知的错误还是我做错了什么?

class ViewController: NSViewController {
    
    var cursor: NSCursor?
    let subframe = CGRect(x: 100, y: 100, width: 300, height: 100)

    override func loadView() {
        let subview = NSView(frame: subframe)
        subview.wantsLayer = true
        subview.layer!.backgroundColor = NSColor.red.cgColor
        view = NSView(frame: CGRect(x: 0, y: 0, width: 500, height: 300))
        view.addSubview(subview)
        view.addTrackingArea(NSTrackingArea(rect: .zero, options: [.activeInKeyWindow, .inVisibleRect, .cursorUpdate, .mouseMoved], owner: self))
    }
    
    override func mouseMoved(with event: NSEvent) {
        if subframe.contains(view.convert(event.locationInWindow, from: nil)) {
            if cursor == nil {
                cursor = .openHand
                cursor!.push()
                print("set cursor")
            }
        } else if let cursor = cursor {
            cursor.pop()
            self.cursor = nil
            print("unset cursor")
        }
//        cursor?.set()
    }
    
}
Cocoa Appkit macOS-Sonoma

评论


答: 暂无答案