Отключите изменение курсора во время нахождения в области отслеживания в swift

#swift #cocoa #nswindow #nscursor

Вопрос:

Я пытаюсь изменить курсор, пока курсор находится внутри представления. Проблема в том, что иногда курсор автоматически возвращается к значению по умолчанию(например, при появлении всплывающего уведомления).

 class DrawingView : NSView{

    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        
        // Drawing code here.
    }

   override func updateTrackingAreas() {
        let area = NSTrackingArea(rect: self.frame, options: [.cursorUpdate,.activeAlways,.inVisibleRect], owner: self, userInfo: nil)
        self.addTrackingArea(area)
    }

    override func cursorUpdate(with event: NSEvent) {
        NSCursor.crosshair.set()
        NSApp.keyWindow?.disableCursorRects()
    }
        
}
 

Насколько мне известно NSWindow , disableCursorRects() предполагается, что это остановит изменение курсора из-за других процессов. Может быть, я неправильно его использую?

Комментарии:

1. Вы изменяете изображение курсора для своего представления в переопределении метода NSResponder cursorUpdate:. Чтобы получить это сообщение, необходимо создать объект NSTrackingArea, вызвав инициализатор initWithRect:options:owner:userInfo: с опцией NSTrackingCursorUpdate (наряду с любыми другими желаемыми параметрами). Затем добавьте созданный объект в представление с помощью addTrackingArea:. После этого ввод мыши в область отслеживания генерирует событие NSCursorUpdate; .. developer.apple.com/library/archive/documentation/Cocoa/…

2. Попробовал это сделать, но cursorUpdate не вызывается. Вопрос обновлен до текущего кода

3. Подкласс NSView и добавьте туда код. Переопределите области отслеживания обновлений и добавьте туда области отслеживания (удалите существующие и добавьте новые. Держите на нем сильный указатель). Коду нет места в viewcontroller, и ваши области отслеживания будут удалены/неверны, как только вы измените размер окна/представления. Не отключайте области курсора, а затем измените курсор -> он не будет вызываться. (это ошибка)

4. Все еще не могу заставить это работать. Не могли бы вы, пожалуйста, проверить текущий код. Теперь изображение курсора даже не меняется!

5. @unkown ваши области отслеживания обновлений должны быть супер. Удалите, а затем добавьте туда новую прямую линию отслеживания. Вы добавляете ту же область отслеживания, не удаляя ранее созданную. Сначала удалите тот, который вы держите сильным указателем, и добавьте новый сохраните сильный указатель. Попробуйте добавить в область отслеживания/наведение мыши / выход и добавьте соответствующие методы, чтобы узнать, вызываются ли они