【问题标题】:Keeping window on top when switching spaces切换空间时保持窗口在顶部
【发布时间】:2011-02-20 21:55:54
【问题描述】:

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

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

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

【问题讨论】:

    标签: macos cocoa mission-control


    【解决方案1】:

    空格是一种痛苦。我的解决方案是像这样注册更改通知:

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

    然后在我的WindowController 班级:

    - (void) activeSpaceDidChange:(NSNotification *)aNotification {
        if ([NSApp isActive]) [[self window] orderFront:self];
    }
    

    【讨论】:

    • 被低估的答案,谢谢。提示:我们需要使用这个 [[self window] setCollectionBehavior:(NSWindowCollectionBehaviorCanJoinAllSpaces)];并删除 dealloc 上的观察者
    【解决方案2】:

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

    // 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()
    }
    

    【讨论】:

      【解决方案3】:

      对于无边框窗口(使用 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”,然后将“无边界”样式设置回来,这似乎是一个更合乎逻辑的解决方案。然而,只是为了看看它需要什么最小的解决方案才能运行,我最终看到了上述作品。如果有人可以填写确切发生的事情以使其正常工作,那就太好了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 1970-01-01
        • 1970-01-01
        • 2012-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多