NSCursor总是重置为Arrow

时间:2012-07-02 03:36:13

标签: objective-c cocoa nscursor

为什么我不能让光标在鼠标拖动期间保持不变?一旦我开始拖动,它就会恢复为“箭头”(即使我在启动后将其设置为应用代理中的开放手)。

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

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

3 个答案:

答案 0 :(得分:17)

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

[[self window] disableCursorRects];

和in -mouseUp:

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

答案 1 :(得分:11)

尝试使用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:

答案 2 :(得分:0)

我遇到了同样的问题,原因是在拖动过程中我正在修改子视图的框架,这似乎重置了光标。当使用.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
    }
    
}