2012-06-16 7 views
15

Mac OS X 10.7以降で動作するCocoaアプリケーションが提供されています:Mac OS X:網膜ディスプレイのランタイムチェックを行う最良の方法は?

少なくとも1つの網膜ディスプレイが接続されたMac上でアプリが実行されているかどうかを実行時に確認するにはどうすればよいですか?

このようなことを確認するのが本当に間違っている場合は、理由をよく説明した理由を十分に歓迎します。

しかし、私はまだ知りたいです:)。

新しいMacBook Pro "Retina"ハードウェア(現在は網膜ディスプレイを持っている唯一のMac)のチェックを行うことができそうですが、もっと一般的な/一般的な/これよりも確かな方法でチェックしてください。

理想的には、網膜ディスプレイで現在出荷されている特定のMacモデルではなく、網膜ディスプレイを検出する方法を知りたいと思います。

答えて

31

実際にこれを行う必要がある場合は、-[NSScreen backingScaleFactor]をご覧ください。しかし、これは間違った方向に向いています。

現在、Retinaディスプレイを搭載したMacは1台しかありませんが、最終的にRetinaをサポートするスタンドアロンディスプレイ(実行時に接続/取り外し可能)があり、内蔵Retinaディスプレイを1xモード。したがって、「Retina display attached」という質問に対する回答はいつでも変更できます。

-convert*ToBacking:の方法または-[NSWindow backingScaleFactor]を使用してコンテンツを所定の縮尺で描画する必要があるかどうかを知りたい場合があります。詳細については、WWDC 2012のセッションビデオ「OS Xでの高解像度のアドバンストヒントとコツ」(投稿されたらうまくいけば数週間以内に)を見てください。

+4

+1またOPには、[OS Xの高解像度ガイドライン](https://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Introduction/Introduction.html)をお読みください。 –

+3

それをするのは間違っていません。 Webサイトは、iPadsとiPhoneに正しいリソースを提供するためには絶対にそれを行う必要があります。それで、どうしてそれがアプリケーションのために異なるべきですか? もちろん、単純なアセットスワップの場合(つまり、@ 2xの場合)、OSにそれを行わせるのではなく、独自のチェック*を行うのは誤りです。 :) –

+2

ウェブブラウザが2xイメージをダウンロードする必要があるかもしれませんが、ブラウザのウィンドウが2xディスプレイ上にある場合のみ...上記の理由によりいつでも変更される可能性があります。 – tjw

5

さて、iOSではUIScreen.scaleプロパティを使用します。 2.0が返された場合は、高解像度ディスプレイのデバイスを使用しています。それ以外の場合は、解像度の低いデバイスを使用しています。

Mac OSでは-[NSScreen backingScaleFactor]または-[NSWindow backingScaleFactor]のいずれかを使用できます。

+2

backingScaleFactorがクラスメソッドではない働いていた、私は任意の画面が高解像度だったかどうかを検出するために必要なインスタンスに走りました。したがって、[[NSScreen mainScreen] backingScaleFactor]または[NSScreen screens]のいずれかである必要があります。 – erkanyildiz

+0

' - [NSScreen backingScaleFactor]'を忘れてしまいました。正しい方法は、ウィンドウのスケールファクタに応じて描画コードを変更することです。システムは、所定のウィンドウに対してどの倍率が適切であるかを決定する役割を担う。 –

+1

@MichaMazaheri:時々、これを描画する必要はありません。私の場合は、複数のスクリーンからスクリーンショットを撮っているので、正確なピクセル位置を計算する必要があります。 - [NSScreen backingScaleFactor]は方法です。 –

8

私はちょうどこれが

float displayScale = 1; 
    if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) { 
     NSArray *screens = [NSScreen screens]; 
     for (int i = 0; i < [screens count]; i++) { 
      float s = [[screens objectAtIndex:i] backingScaleFactor]; 
      if (s > displayScale) 
       displayScale = s; 
     } 
    } 
+4

You for(NSScreen * screen in [NSScreen screens])のように高速反復について知っていますか?あなたに多くのタイピングを保存します(実行時にはより速くなります)。 – DarkDust

+0

はい、これは動作します!いいぞ! float displayScale = 1.0; IF([NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) {ため(NSScreen * [NSScreen画面]の画面) {フロートS = [画面backingScaleFactor];場合(S> displayScale)displayScale = S。 }} NSLog(@ "displayScale =%f"、displayScale); float x0 = displayScale * self.frame.origin.x; float y0 = displayScale * self.frame.origin.y; float w0 = displayScale * self.frame。 x0、y0、w0、h0); NSLog(@ "x =%f; y =%f; w =%f'h =%f" ; –

関連する問題