【问题标题】:Put a transparent NSWindow permanently on top of another NSWindow将一个透明的 NSWindow 永久放在另一个 NSWindow 之上
【发布时间】:2012-02-03 11:43:05
【问题描述】:

我想在NSWebView 上添加一些 UI 控件,因为这个问题“https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview”我现在想添加一个“透明”NSWindow,所以没有关闭按钮等,在顶部我的NSWebView,因此,在我当前的NSWindow之上。

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

编辑::虽然@dzolanta 的方法效果很好,但我想知道是否可以通过使用NSWindowController 来做到这一点,这将使我能够正确使用奥特莱斯等。

【问题讨论】:

    标签: objective-c macos cocoa nswindow


    【解决方案1】:

    子窗口是你需要的。

    使用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];
    

    【讨论】:

    • 我设法显示了窗口,它也在我的视频流之上。唯一不起作用的想法是,当窗口调整大小时,它应该与包含窗口一起拉伸。
    • 为了实现注册你的窗口控制器(或另一个对象,取决于你的应用架构)作为 NSWindowDidResizeNotification 的观察者。通知选择器应该指定一个在父框架的基础上改变子窗口框架的方法(就像创建覆盖窗口时一样)。如果您愿意,也可以使用 - windowDidResize: NSWindowDelegate 的方法。
    【解决方案2】:

    使用窗口控制器的 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")
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多