2012-02-03 35 views
7

Tôi muốn có một số điều khiển giao diện người dùng ở trên cùng của NSWebView và vì sự cố này "https://stackoverflow.com/questions/9120868/video-in-nswebview-hides-views-on-top-of-the-nswebview" Bây giờ tôi muốn thêm "minh bạch" NSWindow, do đó không có nút đóng vv ., trên đầu trang của tôi NSWebView, do đó, trên đầu trang của tôi hiện tại NSWindow.Đặt NSWindow trong suốt vĩnh viễn trên một NSWindow khác

Làm cách nào để đạt được điều này và đảm bảo rằng "cửa sổ lớp phủ" này vẫn giữ nguyên, ngay cả khi tôi di chuyển cửa sổ cơ bản?

EDIT:: Trong khi cách tiếp cận @ dzolanta của hoạt động tốt, tôi tự hỏi, nếu chúng ta có thể làm điều đó bằng cách sử dụng một NSWindowController mà sẽ cho phép tôi để sử dụng đúng Outlets, vv

Trả lời

20

cửa sổ Child là những gì bạn cần.

Tạo NSWindow với NSBorderlessWindowMask và xác định minh bạch sử dụng phương pháp - setOpaque:- setBackgroundColor:. Sau đó, thêm cửa sổ mới được tạo dưới dạng con của cửa sổ có chứa một thể hiện của NSWebView (sử dụng phương pháp - addChildWindow:ordered: của NSWindow). Di chuyển cửa sổ cha mẹ sẽ tự động khiến cửa sổ con di chuyển.

Cập nhật với mã làm việc:

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

tôi quản lý để hiển thị cửa sổ, và nó cũng nằm trên dòng video của tôi . Chỉ nghĩ rằng không làm việc là cửa sổ nên kéo dài cùng với cửa sổ chứa khi nó được thay đổi kích cỡ. – Besi

+3

Để đạt được điều đó đăng ký bộ điều khiển cửa sổ của bạn (hoặc đối tượng khác, tùy thuộc vào kiến ​​trúc ứng dụng của bạn) như một người quan sát của NSWindowDidResizeNotification. Bộ chọn thông báo nên chỉ định phương thức thay đổi khung cửa sổ con trên cơ sở khung của cha mẹ (giống như khi tạo cửa sổ lớp phủ). Bạn cũng có thể sử dụng - windowDidResize: phương thức của NSWindowDelegate nếu bạn thích. – dzolanta

0

Swift 3 phiên bản sử dụng cửa sổ điều khiển:

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") 
    } 
} 
Các vấn đề liên quan