#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 ваши области отслеживания обновлений должны быть супер. Удалите, а затем добавьте туда новую прямую линию отслеживания. Вы добавляете ту же область отслеживания, не удаляя ранее созданную. Сначала удалите тот, который вы держите сильным указателем, и добавьте новый сохраните сильный указатель. Попробуйте добавить в область отслеживания/наведение мыши / выход и добавьте соответствующие методы, чтобы узнать, вызываются ли они