【问题标题】:How to keep window always on the top with Swift? [duplicate]如何使用 Swift 让窗口始终位于顶部? [复制]
【发布时间】:2019-09-16 02:16:28
【问题描述】:

  • Xcode 版本 7.3 (7D175)
  • Swift 2.2 版
  • Mac OS 版本 OS X El Capitan 10.11.4

我想为 Mac OS 和 我已经设置了窗口级别,但它不起作用。

【问题讨论】:

  • 您是否在设置级别之前检查了窗口存在(!= nil)?

标签: swift


【解决方案1】:

让您的应用始终在 Swift 5 中的其他应用之上非常简单。

override func viewDidAppear() {
    view.window?.level = .floating
}

【讨论】:

  • 这应该是公认的答案!
【解决方案2】:

您需要在任何自定义代码之前检查窗口!= nil

class ViewController: NSViewController {
    var addedObserver = false

    override func viewDidLoad() {
        super.viewDidLoad()

        if let window = self.view.window {
            // custom window here
            window.level = Int(CGWindowLevelForKey(.FloatingWindowLevelKey))
        } else {
            addedObserver = true
            self.addObserver(self, forKeyPath: "view.window", options: [.New, .Initial], context: nil)
        }
    }

    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if let window = self.view.window {
            // custom window here
            window.level = Int(CGWindowLevelForKey(.FloatingWindowLevelKey))
        }
    }

    deinit {
        if addedObserver {
            self.removeObserver(self, forKeyPath: "view.window")
        }
    }
}

【讨论】:

  • 谢谢。我已将您的代码添加到我的项目中,但无法将窗口保持在顶部
  • @SteveJiang 是否调用了 // 自定义窗口中的代码?我确实创建了一个新项目并尝试了这段代码。它可以工作并将窗口带到字体顶部,但我不确定 NSWindow 级别做什么。
  • 天啊...这很奇怪。我创建了另一个新项目,并运行您的代码。它运行良好,但在我的旧项目中不起作用,代码相同。
【解决方案3】:

仍在测试它,但这是 Larva 在 Swift 4 中的答案,它似乎正在工作。

var observingFloat = false

 override func viewDidLoad() {
        super.viewDidLoad()
        self.view.wantsLayer = true

        if self.view.window != nil {
            NSApplication.shared.windows.first?.level = NSWindow.Level(rawValue: 1)
        } else {
            observingFloat = true
            self.addObserver(self, forKeyPath: "view.window", options: [.new, .initial], context: nil)
        }
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        if self.view.window != nil {
            NSApplication.shared.windows.first?.level = NSWindow.Level(rawValue: 1)
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多