C-Viorel
C-Viorel

Reputation: 1866

How to prevent a NSCursor from change?

I have a problem while I try to prevent a cursor from changing. I try to put an overlay view over entire window, but, if under that overlay exist an NSTextView, this will force cursor to change. I want to prevent that, and keep the arrow cursor until my overlay view will be removed.

Overriding the cursorUpdate method does not work:

override func cursorUpdate(with event: NSEvent) {
    return
}

Thanks!

Even this question answer does not help. This solution is valid only if the overlay view is smaller than TextView.

enter image description here

Upvotes: 5

Views: 796

Answers (1)

TheNextman
TheNextman

Reputation: 12566

If the NSTextView is yours, you can get the behaviour you want by subclassing and overriding mouseMoved: there. There are several examples available, if you search.

If subclassing the text view is not an option, the best thing would be to use an NSWindow for your overlay.

  • Create the window with the NSWindowStyleMaskBorderless style mask.
  • Make the window opaque, set the alpha, background color
  • Use addChildWindow:ordered to position your overlay

This answer explains it quite well.

Something like this:

var rect = NSRect(x: self.window.frame.origin.x, y: self.window.frame.origin.y, width: self.window.contentView.frame.size.width, height: self.window.contentView.frame.size.height)
var overlay = NSWindow.init(contentRect: rect, styleMask: .borderless, backing: .buffered, defer: false)
overlay.backgroundColor = .red
overlay.isOpaque = false
overlay.alphaValue = 0.5
self.window.addChildWindow(overlay, ordered: .above)

Now you can add your overlay view as the window's contentView. The cursor will not change in response to the views below.

See also.

Upvotes: 3

Related Questions