Currently working on an OSX application that requires UI controls to live above a CinderView (Which is a type of NSOpenGLView).
Obviously first I tried to simply place the objects above one another in InterfaceBuilder, but that had no effect. The NSOpenGLView always draws above all other content.
Next I tried some information someone suggested, with switching to layer-backed views. That crashed my application on startup.
Instead what I found that worked, was to create a separate NSWindow, and style it to be transparent and place it inside of your NSWindow that contains the CinderView / NSOpenGLView.
Create a window to house your AppKit UI controls, and place your NSView inside
// Transparent UI window 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); self.overlayWindow = [[NSWindow alloc]initWithContentRect:rect styleMask:NSBorderlessWindowMask backing:NSBackingStoreBuffered defer:NO]; self.overlayWindow.backgroundColor = [NSColor clearColor]; [self.overlayWindow setOpaque:NO]; // Add it to the window which contains our NSOpenGLView [self.window addChildWindow:self.overlayWindow ordered:NSWindowAbove]; // Place UI in overlay window self.settingsController = [[SettingsViewController alloc] init]; [self.overlayWindow.contentView addSubview:self.settingsController.view]; |