6

但是,我使用-[NSWindow setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces].
它创建了一个窗口,它只完成了我想要的一半:当我切换空间时,窗口也会切换空间(如预期的那样),但我的窗口会移到该空间中所有其他窗口的后面。这尤其糟糕,因为我的应用程序处于活动状态,但它的窗口低于所有其他应用程序的窗口。我尝试将级别更改为 NSFloatingWindowLevel,并且确实将其保持在顶部,但是在切换空间时它会丢失关键状态(焦点)。

我尝试NSWindowCollectionBehaviorMoveToActiveSpace了收集行为,但这绝对不是我想要的。

有希望吗?我知道几乎没有其他与 Spaces 相关的 API。

4

3 回答 3

4

空间是一种痛苦。我的解决方案是注册更改通知,如下所示:

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self 
                             selector:@selector(activeSpaceDidChange:)
                                 name:NSWorkspaceActiveSpaceDidChangeNotification 
                               object:nil];

然后在我的WindowController课上:

- (void) activeSpaceDidChange:(NSNotification *)aNotification {
    if ([NSApp isActive]) [[self window] orderFront:self];
}
于 2011-04-26T07:59:55.780 回答
1

对于无边框窗口(使用 NSBorderlessWindowMask 创建),我敲了敲头,直到我想出了对 Francis 的以下修改:

- (void) activeSpaceDidChange:(NSNotification *)aNotification {

    if ([NSApp isActive]) 
    {
        NSRect windowRect = [[self window] frame];
        [[self window] setStyleMask:NSTitledWindowMask];
        [[self window] setStyleMask:NSBorderlessWindowMask];
        [[self window] setFrame:windowRect display:YES];
        [[NSApplication sharedApplication] activateIgnoringOtherApps : YES];
    }
}

我看到其他人说无边框窗口存在问题,这让我想到了暂时欺骗它而不将其视为无边框窗口的想法。首先,我将样式掩码设置为“Titled”,然后是“activateIgnoringOtherApps”,然后将“无边界”样式设置回来,这似乎是一个更合乎逻辑的解决方案。然而,只是为了看看它需要什么最小的解决方案才能运行,我最终看到了上述作品。如果有人可以填写正在发生的事情以使其正常工作,那就太好了。

于 2013-01-18T12:24:23.083 回答
1

@francis-mcgrew 答案的Swift 5解决方案⤵︎

// Quick Solution: Place this in the AppDelegate in applicationDidFinishLaunching
NSWorkspace.shared.notificationCenter.addObserver(
    self,
    selector: #selector(notifySpaceChanged),
    name: NSWorkspace.activeSpaceDidChangeNotification,
    object: nil
)

// and this in the same class
@objc func notifySpaceChanged() {
    window.orderFrontRegardless()
}
于 2021-05-28T19:07:39.907 回答