我有一个简单的单窗口应用程序,其中包含一个菜单项,允许用户将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;
}
}
答案 0 :(得分:9)
您正在使用错误的级别值。您正在使用查找窗口级别的键。
首先,由于您正在使用Cocoa,因此您应该将Cocoa常量用于窗口级别:NSNormalWindowLevel
和NSStatusWindowLevel
。
如果你看一下这些常数的定义,你会发现:
#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
}