Поместите прозрачное NSWindow навсегда поверх другого NSWindow - PullRequest
8 голосов
/ 03 февраля 2012

Я хочу иметь некоторые элементы управления пользовательским интерфейсом поверх NSWebView, и из-за этой проблемы "https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview" теперь я хочу добавить "прозрачный" NSWindow, поэтому без кнопок закрытия и т. Д.поверх моего NSWebView, следовательно, поверх моего текущего NSWindow.

Как я могу добиться этого и убедиться, что это "окно наложения" остается на месте, даже если я перемещаю базовыйwindow?

EDIT: : Хотя подход @ dzolanta работает нормально, мне интересно, возможно ли это сделать с помощью NSWindowController, который позволил бы мне правильно использовать розетки и т. д.

Ответы [ 2 ]

22 голосов
/ 03 февраля 2012

Детское окно - это то, что вам нужно.

Создайте NSWindow с помощью NSBorderlessWindowMask и определите его как прозрачный, используя методы - 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];
0 голосов
/ 08 августа 2017

Версия 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")
  }
}
...