为 "always on top" 行为切换 NSWindow 级别
Toggling NSWindow level for "always on top" behaviour
我有一个简单的单一 window 应用程序,它有一个菜单项,允许用户让 NSWindow 始终显示在顶部。
我的函数如下所示:
@IBAction func changeAlwaysOnTop(sender: AnyObject) {
if (alwaysOnTopMenuItem.state == NSOnState) {
alwaysOnTopMenuItem.state = NSOffState;
window.level = kCGNormalWindowLevelKey;
} else {
alwaysOnTopMenuItem.state = NSOnState;
window.level = kCGStatusWindowLevelKey;
}
}
打开 "Always on Top" 效果很好 - window 浮动在所有其他应用程序之上,因为它应该如此。然而,当该选项关闭时,window 继续浮动在所有其他 windows 之上,就好像 window.level = kCGNormalWindowLevelKey;
实际上没有做任何事情。
我已经尝试了不同的 window 级别,并且我已经尝试订购 window 出来然后再回来。 window 继续漂浮在所有其他人之上。
如何在将级别设置为 kCGNormalWindowLevelKey
后将 window 恢复正常?
编辑:以下 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;
}
}
您使用的级别值有误。您正在使用查找 window 级别的键。
首先,由于您正在使用 Cocoa,因此您应该为 window 级别使用 Cocoa 常量:NSNormalWindowLevel
和 NSStatusWindowLevel
。
如果您查看这些常量的定义,您会发现:
#define NSNormalWindowLevel kCGNormalWindowLevel
#define NSStatusWindowLevel kCGStatusWindowLevel
请注意 缺少 单词 "Key" 在那些 kCG...
常量的末尾。如果您随后查看这些常量的定义方式,您会发现:
#define kCGNormalWindowLevel \
CGWindowLevelForKey(kCGNormalWindowLevelKey)
#define kCGStatusWindowLevel \
CGWindowLevelForKey(kCGStatusWindowLevelKey)
因此,您使用的值是传递给 CGWindowLevelForKey()
以获取实际级别的键。
这对我有用,而且看起来更好看! (Swift 4)
window.level = .floatingWindowLevel
这对我有用 Swift 4.2.
override func viewDidAppear() {
super.viewDidAppear()
view.window?.level = .floating
}
我有一个简单的单一 window 应用程序,它有一个菜单项,允许用户让 NSWindow 始终显示在顶部。
我的函数如下所示:
@IBAction func changeAlwaysOnTop(sender: AnyObject) {
if (alwaysOnTopMenuItem.state == NSOnState) {
alwaysOnTopMenuItem.state = NSOffState;
window.level = kCGNormalWindowLevelKey;
} else {
alwaysOnTopMenuItem.state = NSOnState;
window.level = kCGStatusWindowLevelKey;
}
}
打开 "Always on Top" 效果很好 - window 浮动在所有其他应用程序之上,因为它应该如此。然而,当该选项关闭时,window 继续浮动在所有其他 windows 之上,就好像 window.level = kCGNormalWindowLevelKey;
实际上没有做任何事情。
我已经尝试了不同的 window 级别,并且我已经尝试订购 window 出来然后再回来。 window 继续漂浮在所有其他人之上。
如何在将级别设置为 kCGNormalWindowLevelKey
后将 window 恢复正常?
编辑:以下 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;
}
}
您使用的级别值有误。您正在使用查找 window 级别的键。
首先,由于您正在使用 Cocoa,因此您应该为 window 级别使用 Cocoa 常量:NSNormalWindowLevel
和 NSStatusWindowLevel
。
如果您查看这些常量的定义,您会发现:
#define NSNormalWindowLevel kCGNormalWindowLevel
#define NSStatusWindowLevel kCGStatusWindowLevel
请注意 缺少 单词 "Key" 在那些 kCG...
常量的末尾。如果您随后查看这些常量的定义方式,您会发现:
#define kCGNormalWindowLevel \
CGWindowLevelForKey(kCGNormalWindowLevelKey)
#define kCGStatusWindowLevel \
CGWindowLevelForKey(kCGStatusWindowLevelKey)
因此,您使用的值是传递给 CGWindowLevelForKey()
以获取实际级别的键。
这对我有用,而且看起来更好看! (Swift 4)
window.level = .floatingWindowLevel
这对我有用 Swift 4.2.
override func viewDidAppear() {
super.viewDidAppear()
view.window?.level = .floating
}