Core Animation レイヤーに setNeedsDisplay メッセージを送っても drawLayer: inContext: メソッドが起動しない?

Ichi Kanaya
2 min readMay 10, 2013

--

脱線続きですが,最近はまったもう一つの例を挙げます.皆さんのコーディング時間を無駄にしないように.

OS X で Core Animation を使ったビューをプログラムしているとします.OS X は iOS とは違いデフォルトではビューの Core Animation がオフになっていますが,xibエディタでビューの Core Animation Layer チェックボックスをオンにするか,ビューに setWantsLayer: メッセージを送ることで Core Animation をオンにできます.

その後,ビュー(NSViewのサブクラス)の更新はビューの drawRect: メソッドではなく,レイヤー(CALayer かそのサブクラス)のデリゲートの drawLayer: inContext: メソッドを使います.また,このメソッドを起動するにはレイヤーに対し setNeedsDisplay メッセージを送ります.(NSView の場合はメッセージにYESというパラメタが必要でしたが,CALayer の場合はパラメタ無しです.)

ただし,レイヤーの大きさがゼロの場合,レイヤーはどれだけ setNeedsDisplay メッセージを受け取っても drawLayer: inContext: メソッドを起動しません.そこで,レイヤーを作成したら必ずframeプロパティを設定しておきましょう.もしビューの中で設定するのであれば,

layer.frame = (CGRect)self.frame;

とすればよいでしょう.CALayer の frame プロパティは CGRect 型,NSView の frame プロパティは NSRect 型ですが,この両者は互換性があるため,そのまま代入できます.

--

--