のサブクラスである クラスがあります。メソッドを実装するか、のデリゲート メソッドであるを実装することによってUIView
、ビュー内に描画することができます。drawRect
drawLayer:inContext:
CALayer
質問が2つあります。
- どのアプローチを使用するかをどのように決定しますか? それぞれの使用例はありますか?
を実装すると、以下を使用してビューをデリゲートとして割り当てていない場合でも、
drawLayer:inContext:
呼び出されます (drawRect
少なくともブレークポイントを設定する限りでは呼び出されません)。CALayer
[[self layer] setDelegate:self];
インスタンスがレイヤーのデリゲートとして定義されていない場合、デリゲート メソッドが呼び出されるのはなぜですか? また、が呼び出された
drawRect
場合に呼び出されないようにするメカニズムは何ですか?drawLayer:inContext:
ベストアンサー1
どのアプローチを使用するかをどのように決定しますか? それぞれの使用例はありますか?
常に を使用しdrawRect:
、UIView
の描画デリゲートとしては使用しないでくださいCALayer
。
インスタンスがレイヤーのデリゲートとして定義されていない場合、デリゲート メソッドが呼び出されるのはなぜですか? また、
drawLayer:inContext:
呼び出された場合に drawRect が呼び出されないようにするメカニズムは何ですか?
すべてのUIView
インスタンスは、その背後にある の描画デリゲートですCALayer
。そのため、[[self layer] setDelegate:self];
何もしないように見えます。冗長です。drawRect:
メソッドは、実質的にビューのレイヤーの描画デリゲート メソッドです。内部的には、UIView
を実装してdrawLayer:inContext:
独自の処理を実行し、 を呼び出しますdrawRect:
。デバッガーで確認できます。
これが、drawRect:
を実装したときに が呼び出されない理由です。また、カスタム サブクラスで描画デリゲート メソッドdrawLayer:inContext:
を実装してはならない理由でもあります。また、ビューを別のレイヤーの描画デリゲートにしてはいけません。そうすると、さまざまな不具合が発生します。CALayer
UIView
drawLayer:inContext:
にアクセスする必要があるためにを実装している場合は、 を呼び出すことによってCGContextRef
の内部から を取得できます。drawRect:
UIGraphicsGetCurrentContext()