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

col*_*ron 3 macos cocoa nswindow swift

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

我的功能看起来像这样:

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

在"Always on Top"上运行良好 - 窗口浮动在所有其他应用程序之上.但是,当关闭该选项时,窗口继续浮动在所有其他窗口之上,就像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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ken*_*ses 10

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

首先,因为你正在使用Cocoa,所以你应该使用Cocoa常量作为窗口级别:NSNormalWindowLevelNSStatusWindowLevel.

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

#define NSNormalWindowLevel kCGNormalWindowLevel
#define NSStatusWindowLevel kCGStatusWindowLevel
Run Code Online (Sandbox Code Playgroud)

请注意这些常量末尾缺少 "Key"一词kCG....如果您然后查找如何定义这些常量,您会发现:

#define kCGNormalWindowLevel                        \
  CGWindowLevelForKey(kCGNormalWindowLevelKey)
#define kCGStatusWindowLevel                        \
  CGWindowLevelForKey(kCGStatusWindowLevelKey)
Run Code Online (Sandbox Code Playgroud)

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

  • 它现在是`Int(CGWindowLevelForKey(CGWindowLevelKey.ModalPanelWindowLevelKey))`,它仍然没有太大的改进.为什么没有'NSWindowLevel`枚举? (8认同)
  • 谢谢 - 这是解决方案.我不得不使用`window.level = Int(CGWindowLevelForKey(Int32(kCGNormalWindowLevelKey)));`(我的意思是,认真的,是什么...... ???) (5认同)
  • 现在它是`Int(CGWindowLevelForKey(.modalPanelWindow))`! (3认同)

小智 5

这对我有用,看起来更好!(快速4)

    window.level = .floatingWindowLevel
Run Code Online (Sandbox Code Playgroud)