iOS: UIView の 'drawRect:' とレイヤーのデリゲート 'drawLayer:inContext:' の使用 質問する

iOS: UIView の 'drawRect:' とレイヤーのデリゲート 'drawLayer:inContext:' の使用 質問する

のサブクラスである クラスがあります。メソッドを実装するか、のデリゲート メソッドであるを実装することによってUIView、ビュー内に描画することができます。drawRectdrawLayer:inContext:CALayer

質問が2つあります。

  1. どのアプローチを使用するかをどのように決定しますか? それぞれの使用例はありますか?
  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: スタックトレース

これが、drawRect:を実装したときに が呼び出されない理由です。また、カスタム サブクラスで描画デリゲート メソッドdrawLayer:inContext:を実装してはならない理由でもあります。また、ビューを別のレイヤーの描画デリゲートにしてはいけません。そうすると、さまざまな不具合が発生します。CALayerUIView

drawLayer:inContext:にアクセスする必要があるためにを実装している場合は、 を呼び出すことによってCGContextRefの内部から を取得できます。drawRect:UIGraphicsGetCurrentContext()

おすすめ記事