も含めてUIKitにあればdrawRect
、RetinaディスプレイのHD面を自動で扱うというのは本当ですか?ではdrawRect
、1024 x 768 ビューの現在のグラフィックス コンテキストは、実際には 2048 x 1536 ピクセルのビットマップ コンテキストであるということですか?
(更新:現在のコンテキストを使用して画像を作成し、drawRect
そのサイズを印刷すると:
CGContextRef context = UIGraphicsGetCurrentContext();
CGImageRef image = CGBitmapContextCreateImage(context);
NSLog(@"width of context %i", (int) CGImageGetWidth(image));
NSLog(@"height of context %i", (int) CGImageGetHeight(image));
新しい iPad では、ステータス バーを無効にすると、2048 と 1536 が出力され、iPad 2 では 1024 と 768 が表示されます)
1ポイント=4ピクセルを自動で処理してくれる贅沢を、私たちは実際に楽しんでいます。
ただし、を使用するCGBitmapContextCreate
と、それらは実際にはポイントではなくピクセルになりますか? (少なくともそのビットマップにデータバッファを提供する場合、バッファのサイズ(バイト数)は明らかに高解像度用ではなく、標準解像度用です。バッファとして渡しNULL
たとしても、それがCGBitmapContextCreate
バッファを処理します、サイズはおそらくデータ バッファーを渡す場合と同じであり、Retina の解像度ではなく、単なる標準解像度です)。
2048 x 1536 は、iPad 1 と iPad 2、および新しい iPad でいつでも作成できますが、新しい iPad にのみ必要なため、メモリとプロセッサと GPU の電力が浪費されます。
では、そのようなビットマップ コンテキストを作成するために a を使用する必要がif () { } else { }
ありますか?また、実際にどのように作成するのでしょうか? そして、CGContextMoveToPoint
Retina ディスプレイを使用するには、すべてのコードを調整する必要があります。これは、コードにとって非常に厄介な場合があります。(または、ローカル変数を定義して、標準解像度の場合は 1 に設定し、網膜の場合は 2 に設定することもできます。そのため、andは、を使用して描画するときだけではなく、常に になります。)x * 2
y * 2
x, y
scaleFactor
[[UIScreen mainScreen] scale]
x
y
x * scaleFactor
y * scaleFactor
x
y
CGContextMoveToPoint
0.0 のスケールが渡された場合、Retina 用に自動的に作成できるようですUIGraphicsBeginImageContextWithOptions
が、コンテキストを作成して保持する必要がある場合 (および UIViewController の ivar またはプロパティを使用して保持する必要がある場合) は使用できないと思います。 . を使用してリリースしないとUIGraphicsEndImageContext
、グラフィックス コンテキスト スタックに残るので、CGBitmapContextCreate
代わりに使用する必要があるようです。(それとも、スタックの一番下にとどめて、気にしないようにしますか?)