2017-04-20 7 views
0

私の最初の試みで問題が発生したようです:Mac/Cocoa:ウィンドウの画面にメニューバーとDockがあるかどうかを判断する方法は?

現在の画面(モニタ)に全画面モードのウィンドウを表示するか、または表示するかを選択する従来の全画面トグル機能を作成しようとしています。 Spacesの構成方法に関係なく、他の画面の内容は影響を受けません。

各スペースがすべての添付画面にまたがる「レガシー」スペースモードでは機能しています。その場合は、1つのメニューバーとDockしかありません。どちらもプライマリ画面にあり、[[NSScreen screens] firstObject]で取得できます。したがって、私はフルスクリーンウィンドウがプライマリ画面上にある場合にのみ、自動非表示にドックやメニューバーを得るために

 if ([nsWin screen] == [[NSScreen screens] firstObject]) { 
      m_normalPresOpts = [nsApp presentationOptions]; 
      [nsApp setPresentationOptions:m_normalPresOpts | NSApplicationPresentationAutoHideMenuBar | NSApplicationPresentationAutoHideDock]; 
     } 

ような何かを行うことができます。

Appleはログインセッションを再開せずにSpaces設定を切り替えることができませんでした。そのため、スクリーンに個別のスペースがある場合、上記のコードがどのように機能するか分かりません。私は、[[NSScreen screens] firstObject]にはまだ左上隅が(0,0)の画面が含まれているため、他の画面のフルスクリーンウィンドウにはメニューバーとDockが表示され続けると考えられます。また、私はまだ10.9を稼働しており、後のバージョンでもすぐにこの権限を取得することを好むでしょう。

をプログラムで確認する方法はありますかスペースの設定方法、または特定の画面にメニューバー/ Dockが含まれているかどうかを確認する方法はありますか?グーグルでは、コードからこれを行うのに関連する結果は得られませんでした。どういうわけか私のディスク上のドキュメントで[NSScreen +screensHaveSeparateSpaces]が見つかりませんでした。それは私の質問に対する決定的な答えですか?

+0

"レガシー"スペースモードの場合でも、ドックは必ずしもプライマリ画面に表示されません。それは、デスクトップの左側または右側に表示するように設定することができ、デスクトップ上に置くことができます。 –

+0

ええ、そうです。セカンダリ画面が「メイン」画面の下に置かれている場合は、それを底に置くのと同じことです。その場合は、以下のHofiのアプローチを使用するか、Dockを自動隠しモードにしてください(一時的に可能です)。 – RJVB

+0

これは一般的な設定だと思います。私は、同じ画面で両方の要素を持たず、しばらくの間、ただ1つの画面で作業する必要があるときには、相対的な位置を変えるのは面倒だと思います。ボトムドックや垂直に積み重ねられたスクリーンには当てはまりませんが、どれくらいの人がそれをやるか* :) – RJVB

答えて

1

Spacesの設定方法をプログラムで判断したり、特定の画面にメニューバー/ Dockが含まれているかどうかを確認する方法はありますか?グーグルでは、コードからこれを行うのに関連する結果は得られませんでした。どういうわけか私はディスク上のドキュメントで[NSScreen + screensHaveSeparateSpaces]が見つかりませんでした。それは私の質問に対する決定的な答えですか?

はい。

ご存知のとおり、この方法は文書化されずに新しいスペースモデルの一部として導入されたため、ドキュメントが古くなっていた場合は、ヘッダーファイルにしか存在しませんでした。当時と今の間のある時点で、ドキュメンテーションが追いついていました。

+0

ありがとうございます。 "teh answer"と思われましたが、確かに確認が必要です:) そして、私は10.9を実行していますが、Xcodeで入手可能なドキュメントが本当に最新であるかは分かりません。できるだけIDEを実行することを避け、Dashクローンを使用してローカルAPIドキュメントをブラウズすることがほとんどです。 (私は本当にXcode 3.2.xを使用して楽しんだが、それ以降のモノリシック版...あまりそうではない。) – RJVB

1

NSScreenこれは、現在の解像度でフルスクリーン矩形である二つの特性

フレーム

を有しています。この矩形には、メニューバーとドックが現在占めているスペースが含まれます。

visibleFrame

アプリケーションのコンテンツを描画するために、現在も安全である、画面の一部分を定義する矩形です。

返される矩形は常に現在のユーザーインターフェイスの設定に基づいており、現在ドックとメニューバーが占有している領域は含まれません。現在のユーザーインターフェイスの設定に基づいているため、返される矩形は呼び出し間で変更される可能性があり、キャッシュされるべきではありません。

ドック非表示が有効になっている場合でも、この方法で返される矩形は全画面より小さくなることがあります。システムは、小さな境界領域を使用してドックを表示するタイミングを決定します。

So, if they are different, than the screen has menubar and/or dock 
+0

私はこれを考えるべきだった。 '[NSScreen + screensHaveSeparateSpaces]'がない10.9より前のシステムの解決策を提供します。しかし、待って、それらは2つの一貫性のないフルスクリーンモードを持っていません:) とにかくおかげで。 – RJVB

関連する問題