Macアプリで他のアプリが表示しているフルスクリーンスペース上にウインドウを表示する方法を記載します。
結論から書くと下記の3つが適切に設定されていれば表示できます。
- NSPanel
- NSWindow.StyleMask
- NSWindow.CollectionBehavior
環境:
- macOS10.14.6
- Xcode10.1
let rect = NSRect(x: 100, y: 100, width: 300, height: 200)
let styleMask: NSWindow.StyleMask = [.titled, .nonactivatingPanel]
let window = NSPanel(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: true)
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
window.makeKeyAndOrderFront(nil)
NSPanel
NSWindowのサブクラスとして定義されています。
iOSでは聞きなれないクラス名ですがmacOSでは昔からあって、用途はメインウィンドウに付属させるサブパネルのような表示に用います。
今や滅多に使いませんが。
let window = NSPanel(contentRect: rect, styleMask: styleMask, backing: .buffered, defer: true)
NSWindowと同じように初期化して使います。Storyboardで生成してもOKです。
NSWindow.StyleMask
ウインドウの表示スタイルです。
let styleMask: NSWindow.StyleMask = [.titled, .nonactivatingPanel]
.nonactivatingPanel
これが必要になります。
アプリをアクティブ化しない付属パネルのような挙動になり、他のアプリのフルスクリーンスペース上に表示できるようになります。
NSWindow.CollectionBehavior
ウインドウの挙動を指定できます。
window.collectionBehavior = [.canJoinAllSpaces, .fullScreenAuxiliary]
.canJoinAllSpaces
全てのスペースに表示できます。メニューバーなどがこのスタイルです。
.fullScreenAuxiliary
フルスクリーンウインドウと同じスペースに表示できます。