19

ご挨拶、

私は、iOS SDK に付属する「ZoomingPDFViewer」の例に触発されたアプリケーションに取り組んでいます。ある時点で、次のコードを見つけました。

// to handle the interaction between CATiledLayer and high resolution
// screens, we need to manually set the tiling view's 
// contentScaleFactor to 1.0. (If we omitted this, it would be 2.0 
// on high resolution screens, which would cause the CATiledLayer 
// to ask us for tiles of the wrong scales.)
pageContentView.contentScaleFactor = 1.0;

私はそれが何をするのかについてもっと学ぼうとcontentScaleFactorしました。それについて言及している Apple のドキュメントをすべて読んだ後、私は Google を検索しましたが、それが実際に何をするかについての明確な答えは見つかりませんでした。

ここに私が興味を持っているいくつかのことがあります:

  1. contentScaleFactorUIView/CALayer のコンテンツが描画されているときに、グラフィック コンテキストに何らかの影響があるようです。これは、高解像度ディスプレイ (Retina ディスプレイなど) に関連しているようです。実際にはどのような効果がcontentScaleFactorあり、何に影響を与えるのでしょうか?

  2. を使用UIScrollViewしてズームするように設定する場合、たとえば私のcontentView ; contentViewのすべてのサブビューもスケーリングされています。これはどのように作動しますか?UIScrollViewビデオ プレーヤーでさえもぼやけて拡大するように変更するプロパティはどれですか?

TL;DR: UIScrollView のズーム機能は「フードの下」でどのように機能しますか? 適切なコードを書くことができるように、それがどのように機能するかを理解したいです。

ヒントや説明は大歓迎です!:)

4

2 に答える 2

7

座標は、ピクセルではなくポイントで表されます。contentScaleFactorポイントとピクセルの関係を定義します。1 の場合、ポイントとピクセルは同じですが、2 の場合 ( Retina ディスプレイのように)、すべてのポイントが 2 つのピクセルを持つことを意味します。

通常の描画では、点を操作するということは、解像度を気にする必要がないことを意味します。iphone 3 (scaleFactor 1) と iphone4 (scaleFactor 2 と 2x 解像度) では、同じ座標と描画コードを使用できます。ただし、画像を(直接、テクスチャとして...)描画し、通常の座標(ポイント)のみを使用している場合、ピクセルからポイントへのマップが1対1であることは信頼できません。画像は 1 ポイントに対応しますが、scaleFactor が 2 (x 方向に 2、y 方向に 2) の場合は 4 ピクセルに対応するため、画像が少しぼやける可能性があります。

あなたと一緒に作業するとCATiledLayer、scalefactor 2 で予期しない結果が生じる可能性があります。aUIViewcontentScaleFactor==2レイヤー a を使用するとcontentScale==2、システムが混乱し、場合によってはスケールが倍増すると思います。Scrollviewでも同様のことが起こるかもしれません。

これで少し明確になることを願っています

于 2011-08-20T08:32:07.533 に答える
2

Apple は、iOS dev ドキュメントの「Supporting High-Resolution Screens」ページに、これに関するセクションを持っています。

ページには次のように記載されています。

カスタム描画コードの更新

アプリケーションでカスタム描画を行う場合、ほとんどの場合、下にある画面の解像度を気にする必要はありません。ネイティブの描画テクノロジにより、論理座標空間で指定した座標が下にある画面のピクセルに正しくマップされることが自動的に保証されます。ただし、コンテンツを正しくレンダリングするために、現在の倍率を知る必要がある場合があります。このような状況では、UIKit、Core Animation、およびその他のシステム フレームワークが、描画を正しく行うために必要な支援を提供します。

プログラムによる高解像度ビットマップ イメージの作成 現在、UIGraphicsBeginImageContext 関数を使用してビットマップを作成している場合は、スケール ファクターを考慮してコードを調整することをお勧めします。UIGraphicsBeginImageContext 関数は、常に倍率 1.0 の画像を作成します。基盤となるデバイスの画面が高解像度の場合、この関数で作成された画像はレンダリング時に滑らかに表示されない場合があります。1.0 以外の倍率で画像を作成するには、代わりに UIGraphicsBeginImageContextWithOptions を使用します。この関数を使用するプロセスは、UIGraphicsBeginImageContext 関数の場合と同じです。

  1. UIGraphicsBeginImageContextWithOptions を呼び出してビットマップ コンテキストを作成し (適切な倍率で)、グラフィックス スタックにプッシュします。
  2. UIKit または Core Graphics ルーチンを使用して、画像のコンテンツを描画します。
  3. UIGraphicsGetImageFromCurrentImageContext を呼び出して、ビットマップのコンテンツを取得します。
  4. UIGraphicsEndImageContext を呼び出して、スタックからコンテキストをポップします。

たとえば、次のコード スニペットは、200 x 200 ピクセルのビットマップを作成します。(ピクセル数は、イメージのサイズに倍率を掛けて決定されます。)

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100.0,100.0), NO, 2.0);

こちらをご覧ください:高解像度スクリーンのサポート

于 2011-10-25T11:34:44.890 に答える