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?
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.
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")
}
}
来源:https://stackoverflow.com/questions/9128134/put-a-transparent-nswindow-permanently-on-top-of-another-nswindow