2012-02-03 20 views
7

Quiero tener algunos controles de IU en la parte superior de un NSWebView y debido a este problema "https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview" Ahora quiero agregar un NSWindow "transparente", sin los botones de cierre, etc. ., en la parte superior de mi NSWebView, por lo tanto, en la parte superior de mi actual NSWindow.Ponga una NSWindow transparente permanentemente sobre otra NSWindow

¿Cómo puedo lograr esto y me aseguro de que esta "ventana de superposición" se mantenga en su lugar, incluso si muevo la ventana subyacente?

EDIT:: Mientras que el enfoque de @ dzolanta funciona bien, me pregunto si es posible hacerlo mediante el uso de un NSWindowController que me permite utilizar adecuadamente Outlets etc.

Respuesta

20

ventana secundaria es lo que necesita.

Crear NSWindow con NSBorderlessWindowMask y definir que sea transparente usando - setOpaque: y - setBackgroundColor: métodos. A continuación, agregue la ventana recién creada como un elemento secundario de la ventana que contiene una instancia de NSWebView (utilizando el método NSWindow- addChildWindow:ordered:). Al mover la ventana principal, automáticamente se moverá la ventana hija.

de actualización con código de de trabajo:

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

que logró mostrar la ventana, y es también en la parte superior de mi flujo de vídeo . El único pensamiento que aún no funciona es que la ventana debe extenderse junto con la ventana que lo contiene cuando se redimensiona. – Besi

+3

Para lograr eso, registre su controlador de ventana (u otro objeto, según la arquitectura de su aplicación) como observador de NSWindowDidResizeNotification. El selector de notificaciones debe especificar un método que cambie el marco de la ventana secundaria en la base del marco principal (al igual que cuando se crea una ventana superpuesta). También puede usar - windowDidResize: método de NSWindowDelegate si lo prefiere. – dzolanta

0

Swift 3 versión del controlador usando la ventana:

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