【发布时间】:2012-06-09 22:15:37
【问题描述】:
我有一个NSWindow,我想把它放在所有东西的前面(计算机的每个应用程序、全屏应用程序等)。即使我点击后台应用程序,NSWindow 也无法进入后台。并且NSWindow 必须跟随用户屏幕,例如,如果用户将桌面切换到桌面2,等等......
我该怎么做?
谢谢!
【问题讨论】:
标签: objective-c xcode macos cocoa nswindow
我有一个NSWindow,我想把它放在所有东西的前面(计算机的每个应用程序、全屏应用程序等)。即使我点击后台应用程序,NSWindow 也无法进入后台。并且NSWindow 必须跟随用户屏幕,例如,如果用户将桌面切换到桌面2,等等......
我该怎么做?
谢谢!
【问题讨论】:
标签: objective-c xcode macos cocoa nswindow
如果您不需要在其他应用的全屏窗口中可见,这并不太难。
首先,要领先于其他一切,只需 setLevel: 使用 NSFloatingWindowLevel 或更高。尝试不同的值,看看哪个值适合您的需求。
接下来,即使用户更改了 Spaces,也可以保持在前面,可能包括 Exposé/Mission Control,setCollectionBehavior: 使用适当的标志对,或者在创建笔尖上的窗口。可以加入所有空间或移动到活动空间将确保您在每个空间中保持可见,但方式略有不同。您可能希望将 Exposé 设置为固定,或者也可能是瞬态。再次尝试两种方式,看看。
但是,当用户切换到全屏空间或仪表板或启动板时,Lion 将隐藏所有空间和移动到活动空间窗口。如果你看的话,你会发现它对这三种情况的每一种都以不同的方式做到这一点。雪豹做事有点不同,山狮也是。
如果您想解决最后一个问题,您需要一些技巧——并且针对每种情况和每个操作系统版本使用不同形式的技巧。基本技巧是捕捉与隐藏相关的通知并在适当的时候取消隐藏。
【讨论】:
您应该修改您的 info.plist 并将 Application is Agent 标志设置为 YES。代理的窗口可以显示在全屏窗口的前面。
【讨论】:
同时设置, info.plist 中的“Application is agent (UIElement)”为“YES”
& 窗位:
self.view.window?.level = NSWindow.Level(rawValue: kCGMainMenuWindowLevel.hashValue - 1)
self.view.window?.collectionBehavior = [.stationary, .canJoinAllSpaces, .fullScreenAuxiliary]
帮助了我。
【讨论】: