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

发布于 2025-01-02 07:58:32 字数 547 浏览 4 评论 0原文

我想在 NSWebView 之上放置一些 UI 控件,并且由于这个问题“ https://stackoverflow.com/questions/9120868/video- in-nswebview-hides-views-on-top-of-the-nswebview " 我现在想添加一个“透明”NSWindow,因此无需关闭按钮等,在我的 NSWebView 之上,因此,在我当前的 NSWindow 之上。

我怎样才能实现这一点并确保这个“覆盖窗口”保持在原位,即使我移动底层窗口?

编辑::虽然 @dzolanta 的方法工作正常,但我想知道是否可以通过使用 NSWindowController 来实现,这将允许我正确使用 Outlet 等。

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.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

猛虎独行 2025-01-09 07:58:32

子窗口就是您所需要的。

使用 NSBorderlessWindowMask 创建 NSWindow 并使用 - 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];

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];
不回头走下去 2025-01-09 07:58:32

使用窗口控制器的 Swift 3 版本:

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")
  }
}

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")
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文