NSCursor всегда сбрасывает на стрелку

Почему я не могу заставить курсор оставаться на месте во время перетаскивания мышью? Как только я начинаю перетаскивать, он возвращается к "Стрелке" (даже если после запуска я установил его в качестве открытой руки в делегате приложения).

- (void)mouseDown:(NSEvent *)event
{
   [[NSCursor closedHandCursor] push];
}

- (void)mouseUp:(NSEvent *)event
{
   [NSCursor pop];
}

2 ответа

Решение

Попробуйте использовать addCursorRect:cursor: установить курсор для вашего просмотра.

Переопределить resetCursorRects на ваш взгляд:

- (void)resetCursorRects
{
    [super resetCursorRects];
    if(drag) {
        [self addCursorRect:self.bounds cursor:[NSCursor closedHandCursor]];
    }
}

Вам нужно позвонить invalidateCursorRectsForView: для принудительного обновления курсора:

[self.window invalidateCursorRectsForView:self];

Но если вы хотите иметь другой курсор за пределами вашего просмотра, вы можете позвонить [[NSCursor closedHandCursor] set] в вашем mouseDragged: метод.

Если вы не хотите, чтобы другие виды изменяли курсор при перетаскивании, вы можете сделать это в -mouseDown:

[[self window] disableCursorRects];

и в -mouseUp:

[[self window] enableCursorRects];
[[self window] resetCursorRects];

У меня была та же проблема, которая была вызвана тем, что во время перетаскивания я изменял фрейм подпредставления, который, кажется, сбрасывает курсор. При добавлении области отслеживания с .cursorUpdate вариант и сброс курсора внутри cursorUpdate(with:), вроде работает правильно.

class MyViewController: NSViewController {

    var cursor: NSCursor?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.addTrackingArea(NSTrackingArea(rect: .zero, options: [.activeInKeyWindow, .inVisibleRect, .cursorUpdate], owner: self))
    }

    override func mouseDown(with event: NSEvent) {
        cursor = NSCursor.closedHand
    }

    override func cursorUpdate(with event: NSEvent) {
        cursor?.set()
    }
        
    override func mouseUp(with event: NSEvent) {
        cursor = nil
    }
    
}
Другие вопросы по тегам