未打开NSWindow将isVisible属性设置为true

时间:2016-12-06 15:25:03

标签: swift macos

我正在尝试使用NSWindow的{​​{1}}属性检测isVisible是打开还是关闭,但它无法正常工作。例如,我覆盖了NSWindow的{​​{1}}方法(我需要在扩展屏幕上显示全屏网页):

loadWindow

KeyWindow:

NSWindowController

但是debugPrint显示override func loadWindow() { self.contentController = WKUserContentController(); guard let contentController = self.contentController else { return } let config = WKWebViewConfiguration() config.userContentController = contentController let externalScreens = NSScreen.externalScreens() let screen = externalScreens.count == 0 ? NSScreen.main()! : externalScreens[0] window = KeyWindow( contentRect: NSRect(x: 0, y: 0, width: screen.frame.width, height: screen.frame.height), styleMask: NSBorderlessWindowMask, backing: NSBackingStoreType.buffered, defer: false, screen: screen ) if let w = window { w.level = Int(CGShieldingWindowLevel()) w.backgroundColor = NSColor.black w.makeKeyAndOrderFront(self) w.makeFirstResponder(self) webView = WKWebView(frame: w.frame, configuration: config) w.contentView = webView! debugPrint("Window is visible = \(w.isVisible)") } } 属性设置为true,尽管窗口尚未打开(控制器的import Foundation import AppKit class KeyWindow : NSWindow { override var canBecomeKey: Bool { return true } } 方法尚未调用)。

如何可靠地找出窗口是否打开(显示在屏幕上)?

1 个答案:

答案 0 :(得分:0)

代码

if let w = window {
    w.level = Int(CGShieldingWindowLevel())
    w.backgroundColor = NSColor.black
    w.makeKeyAndOrderFront(self)
    w.makeFirstResponder(self)

    webView = WKWebView(frame: w.frame, configuration: config)
    w.contentView = webView!

    debugPrint("Window is visible = \(w.isVisible)")
}

你在检查前打电话给w.makeKeyAndOrderFront(self) 根据{{​​3}}:

  

func makeKeyAndOrderFront(Any?)将窗口移动到前面   屏幕列表,在其级别内,并使其成为关键窗口;那是,   它显示了窗口。

从技术上讲,isVisible的工作方式与宣传的一样:) Apple documentation

  

当窗口在屏幕上时,此属性的值为true(偶数   如果它被其他窗户遮挡了);否则,错误。

你的窗口应该在屏幕上 - 尽管你已将它设置为CGShieldingWindowLevel它可能只是因为呼叫而无法看见 w.makeKeyAndOrderFront(self)您可以尝试致电func orderFrontRegardless()

isVisible

在这种情况下,它应立即显示窗口 - 但我认为这是另一个SO问题