将透明的NSWindow永久地放在另一个NSWindow之上

Bes*_*esi 8 macos cocoa objective-c nswindow

我想有一个顶部一些UI控件NSWebView,因为这个问题"和/sf/ask/638460791/ "我现在想要添加一个"透明" NSWindow,所以没有关闭按钮等,在我的上面NSWebView,因此,在我的当前NSWindow.

我怎样才能实现这一点,并确保即使我移动底层窗口,这个"叠加窗口"仍然存在?

编辑::虽然@ dzolanta的方法工作正常,我想知道是否可以通过使用一个NSWindowController允许我正确使用奥特莱斯等的方法来做到这一点.

dzo*_*nta 22

子窗口是您所需要的.

创建NSWindowNSBorderlessWindowMask和定义它使用是透明- setOpaque:- setBackgroundColor:方法.再加入新创建的窗口作为窗口的含有实例的儿童NSWebView(使用NSWindow- addChildWindow:ordered:方法).移动父窗口将自动导致子窗口移动.

使用工作代码更新:

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];
Run Code Online (Sandbox Code Playgroud)

  • 要实现这一点,请注册您的窗口控制器(或另一个对象,具体取决于您的应用程序架构)作为NSWindowDidResizeNotification的观察者.通知选择器应指定一种方法,该方法在父框架的基础上更改子窗口的框架(就像创建叠加窗口时一样).如果您愿意,也可以使用 - windowDidResize:NSWindowDelegate的方法. (4认同)