NSCursor总是重置为Arrow

bor*_*den 10 cocoa objective-c nscursor

为什么我不能在鼠标拖动期间让光标停留?一旦我开始拖动,它就会恢复为"箭头"(即使我在启动后将其设置为app delegate中的开放手).

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

- (void)mouseUp:(NSEvent *)event
{
   [NSCursor pop];
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*Uri 19

如果您不希望其他视图在拖动时更改光标,则可以在-mouseDown中执行:

[[self window] disableCursorRects];
Run Code Online (Sandbox Code Playgroud)

和in -mouseUp:

[[self window] enableCursorRects];
[[self window] resetCursorRects];
Run Code Online (Sandbox Code Playgroud)

  • 如果你这样做,请确保mouseUp被触发真实.在NSTableView和其他类型的视图中,如果你在mouseDown中调用base,那么mouseUp不再被触发,因为底层机制窃取并"消耗"事件.在鼠标输入/退出时使用它也可能是一个很好的解决方案 (3认同)

Dmi*_*try 12

尝试使用addCursorRect:cursor:设置光标进行查看.

覆盖resetCursorRects您的视图:

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

您需要调用invalidateCursorRectsForView:强制更新光标rects:

[self.window invalidateCursorRectsForView:self];
Run Code Online (Sandbox Code Playgroud)

但是如果你想在你看到的外面有不同的光标,你可以调用[[NSCursor closedHandCursor] set]你的mouseDragged:方法.

  • addCursorRect的参数是`[self bounds]`,而不是`[self frame]`. (2认同)