ドキュメントでは、Apple は次の場合にレイヤーの倍率を考慮する必要があると述べています。
- 異なる倍率で追加のコア アニメーション レイヤーを作成し、それらを独自のコンテンツに合成します
- Core Animation レイヤーのコンテンツ プロパティを直接設定する
最後のステートメントは、私には完全に明確ではありません。彼らはまた言います:
コア アニメーション レイヤーを直接使用してコンテンツを提供するアプリケーションは、スケール ファクターを考慮して描画コードを調整する必要がある場合があります。通常、ビューの drawRect: メソッド、またはレイヤーのデリゲートの drawLayer:inContext: メソッドで描画すると、システムはグラフィックス コンテキストを自動的に調整して倍率を考慮します。
通常または常に?これは、ビューのホストされたバッキング レイヤーまたはバッキング レイヤーにサブレイヤーとして追加するすべてのレイヤーに対してのみ有効ですか? 彼らはまた言うからです:
アプリケーションが関連付けられたビューを持たないレイヤーを作成する場合、新しい各レイヤー オブジェクトの倍率は最初は 1.0 に設定されます。その倍率を変更せずに、後でレイヤーを高解像度画面に描画すると、倍率の違いを補うためにレイヤーのコンテンツが自動的に拡大縮小されます。コンテンツを拡大縮小したくない場合は、レイヤーの倍率を 2.0 に変更できますが、高解像度のコンテンツを提供せずに変更すると、既存のコンテンツが予想よりも小さく表示される場合があります。この問題を解決するには、レイヤーに高解像度のコンテンツを提供する必要があります。
ビューのないレイヤーを想像するのが難しいです。レイヤーの階層を想像することはできますが、それらを表示したい場合はすぐに、ビューのバッキングレイヤーのサブ階層として追加するか、それらを使用する他の手段が存在する必要があります(作成してコンテキストでレンダリングするだけのように)?
Core Animation の合成エンジンは、各レイヤーの contentsScale プロパティを調べて、合成中にそのレイヤーのコンテンツをスケーリングする必要があるかどうかを判断します。アプリケーションが関連付けられたビューを持たないレイヤーを作成する場合、新しい各レイヤー オブジェクトの倍率は最初は 1.0 に設定されます。その倍率を変更せずに、後でレイヤーを高解像度画面に描画すると、倍率の違いを補うためにレイヤーのコンテンツが自動的に拡大縮小されます。コンテンツを拡大縮小したくない場合は、レイヤーの倍率を 2.0 に変更できますが、高解像度のコンテンツを提供せずに変更すると、既存のコンテンツが予想よりも小さく表示される場合があります。この問題を解決するには、レイヤーに高解像度のコンテンツを提供する必要があります。
それは実際にはどういう意味ですか?そのようなことlayer.contents = (id)image.CGImage
をするときは、contentsScale を設定する必要があります。レイヤーがデリゲート メソッドを呼び出してコンテンツを描画し、そのレイヤーがビューのバッキング レイヤーではない
場合にも設定する必要があり ますか?drawLayer:inContext: