setCollectionBehavior:
メソッドを用いると、Exposé, Spaces, Mission Control, フルスクリーン時のウインドウの振る舞いをビット演算で指定できる。
一方でsetCanBeVisibleOnAllSpaces:
というメソッドも存在したが、こちらは10.5で非推奨扱いとなっている。
NSWindowCollectionBehavior
NSWindowCollectionBehaviorDefault
NSWindowCollectionBehaviorCanJoinAllSpaces
NSWindowCollectionBehaviorMoveToActiveSpace
NSWindowCollectionBehaviorManaged
NSWindowCollectionBehaviorTransient
NSWindowCollectionBehaviorStationary
NSWindowCollectionBehaviorParticipatesInCycle
NSWindowCollectionBehaviorIgnoresCycle
NSWindowCollectionBehaviorFullScreenPrimary
NSWindowCollectionBehaviorFullScreenAuxiliary
NSWindowCollectionBehaviorFullScreenAllowsTiling
NSWindowCollectionBehaviorFullScreenDisallowsTiling
10.5以降
NSWindowCollectionBehaviorDefault
ウインドウがひとつのスペースに関連づけられる。ウインドウ(アプリ)を選択するとそのウインドウが関連づけられているスペースに移動する。
一般的なウインドウの標準の振る舞い。
NSWindowCollectionBehaviorCanJoinAllSpaces
ウインドウがすべてのスペースに関連づけられる。スペースを切り替えてもウインドウが表示される。
NSWindowCollectionBehaviorMoveToActiveSpace
と同時に使用できない。
NSWindowCollectionBehaviorMoveToActiveSpace
ウインドウ(アプリ)を選択したとき、そのウインドウが関連づけられているスペースに移動しないようにする。代わりにウインドウが現在のスペースに移動してくる。
NSWindowCollectionBehaviorCanJoinAllSpaces
と同時に使用できない。
10.6以降
NSWindowCollectionBehaviorManaged
ウインドウがExposéに対応する。
NSNormalWindowLevelではこれが標準。
NSWindowCollectionBehaviorTransient
Exposéのときにウインドウが隠される。モーダルウインドウやユーティリティウインドウ(パネル)でよくある振る舞い。
NSNormalWindowLevelではないときにこれが標準。
NSWindowCollectionBehaviorStationary
ウインドウはDockやデスクトップのように固定され、Exposéの影響を受けなくなる。タイトルバーを持っていればドラッグによる移動は可能。
Exposé時にも固定で表示される。
NSWindowCollectionBehaviorParticipatesInCycle
ウインドウは“ウインドウサイクル”の一部になる。具体的には、command
+F1
によるウインドウ巡回機能で選択対象になる。
NSWindowCollectionBehaviorIgnoresCycle
ウインドウは“ウインドウサイクル”の対象外になる。具体的には、command
+F1
によるウインドウ巡回機能で選択されなくなる。
10.7以降
NSWindowCollectionBehaviorFullScreenPrimary
フルスクリーン用のボタンがタイトルバー右端に付いて(古い OS X)、フルスクリーンになれるようになる。
NSWindowCollectionBehaviorFullScreenAuxiliary
フルスクリーンウインドウと同じスペースに表示できる。10.11 だとフルスクリーンが無効化されズームボタンがデフォルトになる。
10.11以降
NSWindowCollectionBehaviorFullScreenAllowsTiling
フルスクリーンの分割表示に対応する。
NSWindowCollectionBehaviorFullScreenDisallowsTiling
フルスクリーンするが分割表示に対応しない。
デスクトップに張り付くウインドウの例
[window setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorStationary | NSWindowCollectionBehaviorTransient | NSWindowCollectionBehaviorIgnoresCycle];
[window setLevel:kCGDesktopWindowLevel];
これで、スペースの影響を受けず、Exposé (Mission Control)にも現れないウインドウを作ることができる。
なお、ウインドウレベルを kCGDesktopWindowLevel
等にしておかないと NSWindowCollectionBehaviorTransient
を指定してもデスクトップ Exposé のときにウインドウが画面外に飛んでいってしまうようなので、ウインドウレベルを設定しておく必要がある。