31

ドキュメントでは、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:

4

3 に答える 3

7

OS Xでは基本的に

  1. あなたの窓をつかむ-backingScaleFactor
  2. 各(!)レイヤー-contentsScaleをそのscaleFactorに設定します
  3. -layer:shouldInheritContentsScale:fromWindow:コントローラーに実装する
  4. 各レイヤー-delegateをそのコントローラーに設定します

SO では、外部 URL を参照するだけで眉をひそめていることは知っていますが、これを説明するのは困難です。スケール係数に関して、私にとって正しく機能するコードを次に示します。

https://github.com/JanX2/ScrollingAboutWindow

それが役立つことを願っています。

于 2013-12-16T08:13:38.017 に答える