7

サブクラスを作成しUIView、大量のカスタム コンテンツ ( を使用したアニメーション、 in を使用したカスタム作成の描画) を使用したいCABasicAnimation場合CAShapeLayerCGContextRefサブdrawRectレイヤーを作成、追加、およびアニメーション化する適切なタイミングはいつですか?

メソッドでカスタム描画を実行する必要があることはわかっていますdrawRect(そして、実際にそれを取得できる唯一の場所があるためUIGraphicsGetCurrentContext()、選択肢が狭まります)。現在、サブレイヤー、アニメーション、およびその他の描画に関連しないすべてのものdrawRectも同様に作成しています。しかしdrawRect、そのような活動を行うのに最適な場所かどうかはわかりません。

私はlayoutSubviewsメソッドと他のいくつかのUIViewメソッドに精通していますが、実際には実装していませんdrawRect.

もう一度繰り返しますが、質問は次のとおりです。サブレイヤーをどこに追加し、どこにアニメートするか、また知っておくべきトリックやキャッチはありますか?

4

1 に答える 1

10
  1. レイヤーが永続的である場合は、初期化時にレイヤーを作成して追加できます。動的な場合は、layoutSubviews の方が優れています。これは明らかに、新しいレイヤー/アイテムが必要になるたびに、NeedsLayout を設定する必要があることを意味します。-init と -layoutSubviews を自由に組み合わせることができますが、どちらかを選択する必要がある場合は、layoutSubviews を使用することをお勧めします。drawRect を使用しないでください。

  2. プロパティ (strokeWidth、lineColor、path など) を、作成時または通常の実行時に CAShapeLayer に設定できます。これには、CAShapeLayer へのパスの設定が含まれます。繰り返しますが、drawRect でプロパティを設定しないでください。

  3. レイヤーでカスタム描画を行いたい場合は、レイヤーをサブクラス化し、そのレイヤーで drawRect を使用できます。これは、CALAyers を再利用して拡張する必要がある場合に役立ちます。UIView でない限り、CALayerDelegate を指定することもできます。これらの質問を参照してください: CALayer デリゲート iOS の使用: UIView の 'drawRect:' とそのレイヤーのデリゲート 'drawLayer:inContext:' の使用

  4. アニメーションは簡単で、プロパティの作成と設定と同じ原則に従います。自動アニメーションがいつ呼び出されるか、およびそれらを無効にする方法を理解していることを確認してください: - [CALayer setNeedsDisplayInRect:] で暗黙のアニメーションを無効にします。

  5. 描画は高価です。アニメは安い。drawRect を使いすぎると、アプリケーションのパフォーマンスが大幅に低下します。drawRect/setNeedsDisplay は、状態の変化 (選択/選択解除) などで慎重に使用してください。可能な限り、アニメーションまたは最上位のプロパティを使用してビューを変更し、ビューを再描画しないでください。drawRect に draw 以外のことをさせると、不必要に setNeedsDisplay を呼び出すことになる可能性があります。簡単な事前最適化は、drawRect の呼び出しをできるだけ少なくするか、まったく呼び出さないことです。

于 2013-09-24T21:02:21.840 に答える