NSTrackingArea не всегда обновляет курсор

Мне трудно использовать 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


person promacuser    schedule 22.02.2020    source источник


Ответы (1)


Изменение размера областей отслеживания, чтобы они не пересекались друг с другом, помогло мне решить проблему. Я не могу сказать из вашего примера кода, есть ли у вас эта проблема, но решил поделиться на всякий случай!

person Evan Moran    schedule 02.03.2021