将NSWindow的重点放在首位,即使更换虚拟桌面也是如此

时间:2016-11-30 17:19:48

标签: objective-c xcode macos nswindow

我正在做一个应用程序,其中包括在一段时间之后提出问题,并且用户不能再做任何事情,除非他回答问题,我已经设法通过设置一个来保持窗口总是在顶部9999级:

[_idleWindow setLevel:9999];

我想知道是否有办法避免在窗口打开时更改虚拟桌面,或者在更改虚拟桌面时再次关注窗口。

2 个答案:

答案 0 :(得分:2)

查看setCollectionBehavior:

[_idleWindow setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace|NSWindowCollectionBehaviorTransient|NSWindowCollectionBehaviorFullScreenDisallowsTiling|NSWindowCollectionBehaviorFullScreenAuxiliary];

可能会成功。

此外,如果您可以使用NSPanel而不是NSWindow,则可以添加样式掩码:NSWindowStyleMaskNonactivatingPanel以便在您的应用未激活时提供窗口密钥状态。 (您需要在NSPanel子类中实现canBecomeKeyWindow

答案 1 :(得分:1)

经过对Google的一些研究后,我在另一个Stackoverflow post找到了解决方案。

解决方案:

You need to add this code either in your xib / storyboard, either in your NSWindowController subclass -windowDidLoad method, either in your designated initialiser of your NSWindow subclass :

- (void) awakeFromNib { 
    [self setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces]; //this was the one that worked for me
}
OR

- (id)initWithContentRect:(NSRect)contentRect
                styleMask:(NSUInteger)styleMask
                  backing:(NSBackingStoreType)bufferingType
                    defer:(BOOL)flag {
    if (self = [super initWithContentRect:contentRect styleMask:styleMask  backing:bufferingType defer:flag]) {
        [self setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
    }
    return self;
}
OR if you have a NSWindowController

- (void)windowDidLoad {
    [super windowDidLoad];

    [[self window] setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
}
OR Edit the nib file and add this behaviour to your window in XCode.

致谢:Stefan Szekeres