Put a transparent NSWindow permanently on top of another NSWindow

I want to have some UI controls on top of a NSWebView and because of this problem ” https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview ” I now want to add a “transparent” NSWindow, so without the close buttons etc., on top of my NSWebView, hence, on top of my current NSWindow.

How can I achieve this and make sure that this “overlay window” stays in place, even if I move the underlying window?

  • Utilizing C++ in iOS and Mac OS X applications
  • Key value Observing during UIView Animations
  • Returning errors in objective-c
  • How to create a PDF in Swift with Cocoa (Mac)
  • Can't set URLRequest Authorization Header
  • Set Background colour on NSTableCellView
  • EDIT:: While @dzolanta’s approach works fine, I wonder if it is possible to do it by using an NSWindowController which would allow me to properly use Outlets etc.

    2 Solutions Collect From Internet About “Put a transparent NSWindow permanently on top of another NSWindow”

    Child window is what you need.

    Create NSWindow with NSBorderlessWindowMask and define it to be transparent using - setOpaque: and - setBackgroundColor: methods. Then add newly created window as a child of window containing an instance of NSWebView (using NSWindow‘s - addChildWindow:ordered: method). Moving parent window will automatically cause child window to move.

    Update with working code:

    CGRect wRect = self.window.frame;
    NSView *contentView  =self.window.contentView;
    CGRect cRect = contentView.frame;
    
    CGRect rect = CGRectMake(wRect.origin.x, wRect.origin.y, cRect.size.width, cRect.size.height);
    NSWindow *overlayWindow = [[NSWindow alloc]initWithContentRect:rect 
                                                         styleMask:NSBorderlessWindowMask 
                                                           backing:NSBackingStoreBuffered 
                                                             defer:NO];
    overlayWindow.backgroundColor = [NSColor redColor];
    [overlayWindow setOpaque:NO];
    overlayWindow.alphaValue = 0.5f;
    
    [self.window addChildWindow:overlayWindow ordered:NSWindowAbove];
    

    Swift 3 version using window controller:

    final class OverlayWindowController: NSWindowController {
      init(frame: NSRect) {
        let window = NSWindow(contentRect: frame, styleMask: .borderless, backing: .buffered, defer: false)
        super.init(window: window)
    
        window.contentViewController = MyViewController()
        window.backgroundColor = NSColor.clear
        window.isOpaque = false
      }
    
      @available(*, unavailable)
      required init?(coder: NSCoder) {
        fatalError("init(coder:) is unavailable")
      }
    }