setCollectionBehavior不会对已打开的窗口产生影响

时间:2015-08-06 21:49:53

标签: objective-c macos

用户点击我的应用程序中的“在10秒内截取屏幕截图”按钮。然后用户关注另一个应用程序并使其全屏显示。当用户专注于这个全屏幕应用程序时,我的10秒计时器现在达到0.我的应用程序打开一个完整大小的监视器窗口,它在其上绘制屏幕截图。但现在我希望窗口显示在所有空间上。我试过这个:

[window setCollectionBehavior:(16 | 1 | 256)];

但它不是让窗口显示在用户当前空间(这是全屏应用程序)你们知道吗?

只是为了验证,这些常量的神奇数字是:

var NSWindowCollectionBehaviorStationary = 1 << 4; // 16
var NSWindowCollectionBehaviorCanJoinAllSpaces = 1 << 0; // 1
var NSWindowCollectionBehaviorFullScreenAuxiliary = 1 << 8; // 256
var NSWindowCollectionBehaviorMoveToActiveSpace = 1 << 1;// 2

这是对的吗?我是通过ctypes这样做的,所以必须使用魔术数字。

我也尝试过:

 [window setCanBeVisibleOnAllSpaces:YES]

但它没有用。

由于

编辑: 所以这个窗口已经打开,我没有访问故事板等,如下面a2的答案所述,我们在聊天中进行了讨论,我们需要以某种方式勾选它以使其生效,是否有人有任何想法?

1 个答案:

答案 0 :(得分:1)

您需要在您的NSWindowController子类-windowDidLoad方法中的xib / storyboard中添加此代码,或者在NSWindow子类的指定初始值中添加:

- (void) awakeFromNib { 
    [self setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces]; 
}

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;
}

如果你有NSWindowController

,或者
- (void)windowDidLoad {
    [super windowDidLoad];

    [[self window] setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces];
}

或编辑nib文件并将此行为添加到XCode中的窗口。