源自后台NSView的NSCursor不正确

时间:2016-04-01 15:24:32

标签: cocoa

我想在我的cocoa应用程序中更改光标。我已经跟随this answer中的示例,并取得了成功。

我有一个NSView,我们称之为NSViewA,在另一个NSViewNSViewB后面。 NSViewA包含已更改游标的子类NSButtonNSViewANSViewB具有相同的超级视图。所以像这样:

- NSWindow
    - NSViewA
        - NSButtonSubclass
    - NSViewB

我的问题是,当显示NSViewB时,光标位于NSViewB的顶部,但是在NSButton后面的NSViewB的相同xy坐标中,光标对NSButton子类中指定的更改。

如何停止此行为?

这种布局的原因是我正在创建一个“灯箱”控件。如果您认为NSWindow的某些内容会变灰,并且会出现一个显示错误消息的居中框。那种事。

我以前遇到过一个问题,你仍然可以点击NSViewB后面的按钮等。这是通过抑制mouseDown:mouseUp:来解决的。我尝试过与其他与鼠标相关的事件做类似的事情,例如mouseEntered:mouseExited:没有运气。

1 个答案:

答案 0 :(得分:1)

您是否可以根据按钮的enabled状态添加自定义光标矩形?换句话说,您的resetCursorRects将如下所示:

// MyButton.swift
override func resetCursorRects() {
    if enabled {
        addCursorRect(bounds, cursor: NSCursor.pointingHandCursor())
    }
}

每当要显示viewB时,请禁用该按钮,并呼叫属于您的按钮的rects无效。如果您正在使用Swift,则可以在附加到enabled属性本身的属性观察器中执行此操作:

// MyButton.swift
override var enabled: Bool {
    didSet {
        window!.invalidateCursorRectsForView(self)
    }
}

如果您不希望自己的按钮采用已禁用外观,请将addCursorRect来电视为其他标志。