3

CALayersを使用してUITableViewCellに描画しています。UITableViewCellのコンテンツでレイヤーがどのように順序付けられているかを理解しようとしています。例えば:

  1. cellForRow:atIndexPathメソッドのUITableViewCellにラベルを追加します
  2. UITableViewCellのdrawRectメソッドで、現在のコンテキストを使用してコンテンツを描画します
  3. また、drawRectでいくつかのサブレイヤーを追加します

では、これらの要素の順序はどうなるでしょうか。CALayersにzPositionがあることは知っていますが、それらが常にUITableViewCellのサブビューの上にあるかどうかはわかりません。そして、drawRectで描画されるコンテンツがどこにあるのかわかりません。ヘルプやドキュメントへのリンクは素晴らしいでしょう。私はCoreAnimationプログラミングガイドを読みましたが、これが答えられる場所はどこにも見当たりませんでした。

4

2 に答える 2

4

ビューと同様に、CALayer は階層を維持します。サブレイヤーはスーパーレイヤーの前にレンダリングされ、すべて階層を上ります。このzPositionプロパティは、兄弟レイヤーを上下に配置してレンダリングを制御する場合にのみ使用してください。その場合でも、兄弟レイヤーをsublayersプロパティ内で順序付けることをお勧めします (レイヤーはその配列内にある順序で描画され、連続する各レイヤーは配列内の前のレイヤーの上に描画されます)。

この階層を理解するのは非常に簡単です。なぜなら、サブレイヤーをコードで作成するときに手動でレイヤーにサブレイヤーを追加し、UITableViewCell のバッキング レイヤー (レイヤーでサポートされた UIView のサブクラス) にまでさかのぼるからです。

余談ですが、-drawRect:メソッド内で UITableViewCell にレイヤーを追加するべきではありません。これは、UITableViewCell の基本レイヤーのコンテンツを描画するためにのみ使用する必要があります。このメソッド内で CALayer を割り当てて設定すると、スクロールまたは再描画中に大幅な速度低下が発生する可能性があります。これらのレイヤーは、UITableViewCell が初期化される時点で 1 回だけ設定する必要があり、セルが再利用されるときに更新するだけです。

于 2010-03-31T15:11:36.597 に答える
3
  1. UITableViewCell(または派生クラス)はUIViewから派生します。これは、layerプロパティを介してアクセスできる1つのCALayerを所有しています。このレイヤーは、ビューの全領域を占めます。セルビューに追加するUILabelは、セルのUIViewの子になり、それらのCALayerはセルのCALayerの子になります。子レイヤーは、親の前に描画されます。
  2. UIViewのdrawRectメソッドで何かを描画すると、UIViewが所有するCALayerはビットマップに支えられます。UILabelは、その大きさに応じて、このビットマップを部分的または完全に覆い隠します。
  3. 後でセルのレイヤーに追加する子CALayerは、UILabelのレイヤーの兄弟になり、後で追加したため、デフォルトでそれらの下に追加されます(ただし、順序を制御できるバージョンのメソッドが追加されています)。

パフォーマンス上の理由から、UITableViewCellで描画すると同時に子ビューを使用することはお勧めしません。同じ理由で、4つを超える子ビュー/レイヤーを持つことはお勧めしません。

于 2010-03-31T15:12:08.350 に答える