将 NSWindow 的焦点设置在顶部,即使更改虚拟桌面也是如此
Set focus of NSWindow on top, even if changing of virtual desk
我正在做一个应用程序,它包括在一定时间后提出问题,用户不能再做任何事情,除非他回答问题,我已经设法维护 window通过设置 9999 级别始终位于顶部:
[_idleWindow setLevel:9999];
我想知道是否有办法避免在 window 打开时更改虚拟桌面,或者在更改虚拟桌面时再次聚焦 window。
查看 setCollectionBehavior:
[_idleWindow setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace|NSWindowCollectionBehaviorTransient|NSWindowCollectionBehaviorFullScreenDisallowsTiling|NSWindowCollectionBehaviorFullScreenAuxiliary];
可能会成功。
此外,如果您可以使用 NSPanel 而不是 NSWindow,则可以添加样式掩码:NSWindowStyleMaskNonactivatingPanel
以提供 window 键状态,即使您的应用未处于活动状态。 (你需要在 NSPanel 子类中实现 canBecomeKeyWindow
)
经过对 Google 的一些研究,我在另一个 Whosebug 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.
我正在做一个应用程序,它包括在一定时间后提出问题,用户不能再做任何事情,除非他回答问题,我已经设法维护 window通过设置 9999 级别始终位于顶部:
[_idleWindow setLevel:9999];
我想知道是否有办法避免在 window 打开时更改虚拟桌面,或者在更改虚拟桌面时再次聚焦 window。
查看 setCollectionBehavior:
[_idleWindow setCollectionBehavior:NSWindowCollectionBehaviorMoveToActiveSpace|NSWindowCollectionBehaviorTransient|NSWindowCollectionBehaviorFullScreenDisallowsTiling|NSWindowCollectionBehaviorFullScreenAuxiliary];
可能会成功。
此外,如果您可以使用 NSPanel 而不是 NSWindow,则可以添加样式掩码:NSWindowStyleMaskNonactivatingPanel
以提供 window 键状态,即使您的应用未处于活动状态。 (你需要在 NSPanel 子类中实现 canBecomeKeyWindow
)
经过对 Google 的一些研究,我在另一个 Whosebug 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.