8

まず第一に、レイヤーをレンダリングするさまざまな方法に関しては、iPhone のオンライン ドキュメントがあまり明確ではないことがわかりました。私はそれの要点を理解していますが、いつどのメソッドを使用し、どのレイヤーをサブレイヤーとして追加する必要があるかは明確ではありません。

私のプロジェクトは、画像をロードし、[image drawAtPoint:] と [image drawInRect:] を介して単純に UIView に描画することから始まりました。これらは、現在のグラフィックス コンテキストを使用して正常に動作します。

それから今日、レイヤーを使用するというこの概念をたまたま読んだので、さまざまな画像を(暗黙的に)アニメーション化することは理論的には簡単です!

記録のために、私はドキュメントがCALayerのサブクラス化が不必要であると言っていることを知っていますが、私はそれをしました。今、レイヤーをレンダリングすると思われるさまざまな方法について、私は信じられないほど混乱しています。

  • drawLayer
  • 表示レイヤー
  • 画面
  • drawInContext

これらすべての方法で、レイヤーのフレーム サイズを設定する必要がありますか? ビューのレイヤーにレイヤーを追加する必要はありますか?

目に見える結果が得られる唯一のメソッドは drawinContext メソッドです。しかし、暗黙的なアニメーション (image.opacity = 0 など) を適用すると何も起こらず、レイヤーが適切に設定されていないと思われます。

誰かこの混沌に秩序を取り戻してください。

4

2 に答える 2

18

Core Animation は、この種のことを簡単にします。ブラッドの提案は正しい。肝心なのは、レイヤーを単純にレンダリングするのにこれらのメソッドは必要ないということです。レイヤーをレンダリングするには、次のことを確認してください。

  • 次のようにコンテンツ プロパティを設定します。

    [imageLayer setContents:(id)[[UIImage imageNamed@"image.png"] CGImage]];

  • レイヤーの境界を必要なサイズに設定します。

    [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];

  • ビューに表示するレイヤーの位置 (x、y 位置) を設定します。デフォルトの anchorPoint はレイヤーの中心です。このコードは、レイヤーをビューの中央に配置します。

    [imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];

  • ビューのレイヤーにレイヤーを追加します。

    [[[self view] layer] addSublayer:imageLayer];

ちなみに、必要に応じて、-setFrame: を呼び出して、1 つのメソッドで境界と位置の両方を設定できます。読みやすいと感じるので、私は 2 つの呼び出しを自分で使用することを好みますが、それはあなた自身の好み次第です。ただし、レイヤーの境界と位置またはフレームを設定しないと、レイヤーはレンダリングされません。

必要に応じて、パス、形状 (CAShaperLayer を参照)、または追加の画像を描画する追加のレイヤーを作成し、それらを画像レイヤーのサブレイヤーとして追加するか、親レイヤーのサブレイヤーとして追加して zPosition を与えることにより、drawInContext の使用を避けることができます。これにより、画像レイヤーの前に表示されます。

ここで、不透明度をアニメーション化する場合は、説明したとおりにレイヤー プロパティを設定するだけで暗黙的なアニメーションを使用できます。これにより、レイヤーとそのすべての子レイヤーが 0.25 秒でフェードします。

いくつかの追加の考え。

よろしくお願いします。

于 2009-08-20T19:35:29.840 に答える
2

さまざまなレイヤーでそれぞれ 1 つの画像を表示するだけの場合は、それらをサブクラス化する必要はまったくありません。contents各レイヤーのプロパティに(CGImageRef形式で)画像を設定できるはずです。その後、レイヤーはその画像の描画を処理します。読み取り専用プロパティを使用して、UIImage の Core Graphics 画像表現を取得できCGImageます。

-drawInContext:ただし、 CALayer サブクラス内により多くのカスタム描画コードを配置する適切な場所であることについては正しいです。CALayer をサブクラス化せずに、デリゲート メソッドを使用してレイヤーの描画動作をデリゲートに変更させることができます-drawLayer:inContext:

これについては、Apple のCore Animation Programming Guideの「レイヤ コンテンツの提供」セクションで詳しく説明されています。

于 2009-08-20T12:33:00.557 に答える