2012-02-03 16 views
7

NSWebViewの上にUIコントロールをいくつか配置したいのですが、この問題のために "https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview"を追加したいのですが、閉じるボタンを使わないで "透明" NSWindowを追加します。 。私のNSWebViewの上に、従って、私の現在のNSWindowの上に。透明なNSWindowを別のNSWindowの上に永久的に置く

これを実現するには、どのようにして、この「オーバーレイウィンドウ」が元のウィンドウを移動した場合でも、そのままにしておくことができますか?

EDIT::@ dzolantaのアプローチはうまく動作しますが、私がきちんとなどアウトレット

答えて

20

子ウィンドウは何が必要ですを使用することができるようになるNSWindowControllerを使用することによって、それを行うことが可能であるならば、私は疑問に思います。

の方法を使用してとを使用して透明に定義します。次に、新たに作成したウィンドウを、NSWebViewNSWindow- 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

私はウィンドウを表示するために管理し、それは私のビデオストリームの上にもある作業コードと

更新。まだ動作していないと思うのは、ウィンドウがサイズ変更されたときに、ウィンドウがウィンドウと共に伸びるということだけです。 – Besi

+3

これを実現するには、NSWindowDidResizeNotificationのオブザーバーとして、ウィンドウコントローラー(またはアプリケーションアーキテクチャーに応じて別のオブジェクト)を登録します。通知セレクタは、(オーバーレイウィンドウを作成するときと同様に)親フレームのベースにある子ウィンドウのフレームを変更するメソッドを指定する必要があります。必要に応じて、NSWindowDelegateの - windowDidResize:メソッドを使用することもできます。 – dzolanta

0

スウィフト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") 
    } 
} 
関連する問題