【问题标题】:NSTrackingArea doesn't always update cursorNSTrackingArea 并不总是更新游标
【发布时间】:2026-01-18 22:30:01
【问题描述】:

我很难使用NSTrackingArea 更新光标以显示我的自定义可拖动NSView 可以调整大小的位置。这是一个例子:

句柄的NSRect

var handleBottomLeft: NSRect {
    NSRect(x: self.bounds.origin.x,
           y: self.bounds.origin.y,
           width: handleMargin + borderWidth,
           height: handleMargin + borderWidth)
}

追踪区域:

var bottomLeftTrackingArea: NSTrackingArea?

override func updateTrackingAreas() {
    if let area = bottomLeftTrackingArea {
        self.removeTrackingArea(area)
    }
    bottomLeftTrackingArea = nil
    bottomLeftTrackingArea = NSTrackingArea(rect: handleBottomLeft, options: [.activeInKeyWindow, .cursorUpdate], owner: self, userInfo: nil)
    addTrackingArea(bottomLeftTrackingArea!)
    super.updateTrackingAreas()
}

最后,光标更新:

override func cursorUpdate(with event: NSEvent) {
    switch event.trackingArea {
    case bottomLeftTrackingArea:
        print("pointing hand")
        NSCursor.pointingHand.set()
    default:
        print("arrow")
        super.cursorUpdate(with: event)
    }
}

光标在进入或离开蓝色框时应该会发生变化,但只有 50-75% 的时间会发生这种情况。这是一个光标进入时不改变但离开时改变的示例。

https://i.imgur.com/fbqqzGy.mp4

【问题讨论】:

    标签: swift macos cocoa nstrackingarea


    【解决方案1】:

    调整我的跟踪区域以不相互重叠有助于解决我的问题。我无法从您的示例代码中判断您是否有此问题,但我想我会分享以防万一!

    【讨论】:

      最近更新 更多