2012-02-03 109 views
7

我想要在NSWebView的頂部有一些UI控件,並且由於這個問題「https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview」我現在想添加一個「透明」NSWindow,所以沒有關閉按鈕等。,在我的NSWebView之上,因此,在我目前的NSWindow之上。把一個透明的NSWindow永久地放在另一個NSWindow

如何實現這一點,並確保這個「覆蓋窗口」保持原位,即使我移動底層窗口?

編輯::雖然@ dzolanta的方法工作得很好,我不知道是否有可能通過使用NSWindowController這將允許我適當地使用奧特萊斯等

回答

20

子窗口,你需要做的吧。

創建NSWindowNSBorderlessWindowMask並使用- 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

我設法顯示窗口,這也是對我的視頻流的頂部。唯一沒有奏效的想法是,窗口在調整大小時應該與包含窗口一起展開。 – Besi 2012-02-03 16:32:33

+3

作爲NSWindowDidResizeNotification的觀察者,實現該功能,將窗口控制器(或另一個對象,取決於您的應用程序體系結構)註冊。通知選擇器應該指定一種方法,它根據父框架改變子窗口的框架(就像創建覆蓋窗口時一樣)。如果您願意,也可以使用NSWindowDelegate的--windowDidResize:方法。 – dzolanta 2012-02-03 17:16:27

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