切换NSWindow级别的“永远在线”行为

时间:2015-03-03 10:39:20

标签: macos cocoa swift nswindow

我有一个简单的单窗口应用程序,其中包含一个菜单项,允许用户将NSWindow显示在最顶层。

我的功能如下:

@IBAction func changeAlwaysOnTop(sender: AnyObject) {
    if (alwaysOnTopMenuItem.state == NSOnState) {
        alwaysOnTopMenuItem.state = NSOffState;
        window.level = kCGNormalWindowLevelKey;
    } else {
        alwaysOnTopMenuItem.state = NSOnState;
        window.level = kCGStatusWindowLevelKey;
    }
}

转向"始终在顶部"效果很好 - 窗口浮动在所有其他应用程序之上。但是,当关闭该选项时,窗口继续浮动在所有其他窗口之上,就像window.level = kCGNormalWindowLevelKey;实际上没有做任何事情一样。

我尝试过不同的窗口级别,并且我已经尝试将窗口排除并再次进入。窗口继续浮动在其他窗口之上。

将级别设置为kCGNormalWindowLevelKey后,如何将窗口恢复正常?

编辑:以下Objective C代码工作正常:

- (IBAction)changeOnTop:(id)sender {
    if (self.onTopMenuItem.state == NSOnState) {
        self.onTopMenuItem.state = NSOffState;
        self.window.level = NSNormalWindowLevel;
    } else {
        self.onTopMenuItem.state = NSOnState;
        self.window.level = NSStatusWindowLevel;
    }
}

3 个答案:

答案 0 :(得分:9)

您正在使用错误的级别值。您正在使用查找窗口级别的键。

首先,由于您正在使用Cocoa,因此您应该将Cocoa常量用于窗口级别:NSNormalWindowLevelNSStatusWindowLevel

如果你看一下这些常数的定义,你会发现:

#define NSNormalWindowLevel kCGNormalWindowLevel
#define NSStatusWindowLevel kCGStatusWindowLevel

注意缺少这个词" Key"在那些kCG...常量的末尾。如果您然后查找如何定义这些常量,您将找到:

#define kCGNormalWindowLevel                        \
  CGWindowLevelForKey(kCGNormalWindowLevelKey)
#define kCGStatusWindowLevel                        \
  CGWindowLevelForKey(kCGStatusWindowLevelKey)

因此,您使用的值是传递给CGWindowLevelForKey()以获得实际级别的键。

答案 1 :(得分:5)

这适合我,看起来更好一点! (斯威夫特4)

    window.level = .floatingWindowLevel

答案 2 :(得分:1)

这在Swift 4.2中对我有用。

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