【问题标题】:NSCursor always resets to ArrowNSCursor 总是重置为箭头
【发布时间】:2012-07-02 03:36:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c cocoa nscursor


    【解决方案1】:

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

    [[self window] disableCursorRects];
    

    在 -mouseUp 中:

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

    【讨论】:

    • 如果您这样做,请确保真正触发 mouseUp。在 NSTableView 和其他类型的视图中,如果你在 mouseDown 中调用 base,那么 mouseUp 就不会再被触发,因为底层机制会窃取并“消耗”事件。在鼠标进入/退出时使用它也可能是一个很好的解决方案
    【解决方案2】:

    尝试使用addCursorRect:cursor: 设置光标供您查看。

    为您的视图覆盖resetCursorRects

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

    您需要调用invalidateCursorRectsForView: 来强制更新您的光标矩形:

    [self.window invalidateCursorRectsForView:self];
    

    但是如果你想在你的视图之外有不同的光标,你可以在你的mouseDragged:方法中调用[[NSCursor closedHandCursor] set]

    【讨论】:

    • 哦!我看到了类似的东西,但是为我想要添加的东西覆盖reset似乎很愚蠢。我现在明白了,当我现在更改视图的位置时,光标 rect 会失效!谢谢。
    • addCursorRect 的参数是[self bounds],而不是[self frame]
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2020-02-20
      • 2022-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多