2012-02-03 7 views
7

Chcę mieć kilka elementów sterujących UI na NSWebView iz tego powodu "https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview" Chcę teraz dodać "przezroczysty" NSWindow, więc bez przycisków zamykających itp. ., na szczycie mojego NSWebView, a więc na moim obecnym NSWindow.Połóż przezroczysty NSWindow na stałe na innym NSWindow

Jak mogę to osiągnąć i upewnić się, że to "okno nakładki" pozostanie na swoim miejscu, nawet jeśli przesuniemy znajdujące się pod nim okno?

EDIT:: Podczas użytkownika @ dzolanta podejście działa dobrze, zastanawiam się, czy jest możliwe, aby to zrobić przy użyciu NSWindowController który pozwoliłby mi właściwie korzystać Outlets itp

Odpowiedz

20

okno dziecko jest to, czego potrzebujesz.

Tworzenie NSWindow z NSBorderlessWindowMask i zdefiniować go w sposób przejrzysty i przy użyciu - setOpaque:- setBackgroundColor: metod. Następnie dodaj nowo utworzone okno jako okno potomne zawierające instancję NSWebView (używając metody NSWindow 's - addChildWindow:ordered:). Przeniesienie okna nadrzędnego automatycznie spowoduje przesunięcie okna podrzędnego.

Aktualizacja z kodu pracy:

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

udało mi się otworzyć okno, a także jest na szczycie mojej strumienia wideo . Jedyna myśl, która jeszcze nie działa, polega na tym, że okno powinno rozciągać się wraz z oknem zawierającym, gdy zostanie zmniejszona. – Besi

+3

Aby to osiągnąć, zarejestruj kontroler okien (lub inny obiekt, w zależności od architektury aplikacji) jako obserwator NSWindowDidResizeNotification. Selektor powiadomień powinien określać metodę, która zmienia ramkę okna podrzędnego na podstawie ramki rodzica (podobnie jak podczas tworzenia okna nakładki). Możesz także użyć - windowDidResize: metoda NSWindowDelegate, jeśli wolisz. – dzolanta

0

Swift 3 wersji kontrolera za pomocą okna:

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") 
    } 
} 
Powiązane problemy