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
}
}