6

を使用してウィンドウを作成しましたが、-[NSWindow setCollectionBehavior:NSWindowCollectionBehaviorCanJoinAllSpaces].
それは私が望むことの半分しか行いません: スペースを切り替えると、ウィンドウもスペースを切り替えます (予想どおり) が、ウィンドウはそのスペース内の他のすべてのウィンドウの後ろに移動します。私のアプリはアクティブですが、そのウィンドウは他のすべてのアプリのウィンドウの下にあるため、これは特に悪いことです。レベルを NSFloatingWindowLevel に変更しようとしましたが、それはそれを一番上に保ちますが、スペースを切り替えるとキーステータス (フォーカス) が失われます。

コレクションの動作を試しNSWindowCollectionBehaviorMoveToActiveSpaceてみましたが、探しているものではありません。

希望はありますか?Spaces に関連する API は他にほとんどありません。

4

3 に答える 3

4

スペースは苦痛です。私の解決策は、次のような変更通知に登録することでした。

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

それから私のWindowControllerクラスでは:

- (void) activeSpaceDidChange:(NSNotification *)aNotification {
    if ([NSApp isActive]) [[self window] orderFront:self];
}
于 2011-04-26T07:59:55.780 に答える
1

ボーダーレス ウィンドウ (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」を設定してから、「borderless」スタイルを設定し直しました。これは、より論理的な解決策のように思われました。それでも、それが機能するために必要な最小限のソリューションを確認するだけで、上記の作品を見ることになりました. これが機能することを可能にする正確に何が起こっているのかを誰かが記入できれば素晴らしいことです.

于 2013-01-18T12:24:23.083 に答える