2012-01-11 9 views
0

According to documentation デフォルトの実装は何もしません。 [CALayerのdrawInContext:] デリゲートメソッドを呼び出す -- [CALayer drawInContext:]何かする?

3 EasyWakeup       0x0003a7b6 -[AlarmIntervalView drawRect:] + 71 
4 UIKit        0x003f6187 -[UIView(CALayerDelegate) drawLayer:inContext:] + 426 
5 QuartzCore       0x011a8b5e -[CALayer drawInContext:] + 143 

ので、私は理解できるとして、それはデフォルトの実装を意味

は、しかし...私はのdrawRectメソッドから例外をスローし、私は次のコールスタックを参照してください。 正しいですか? 私は知られているスウィズリングのテクニックを持っているので、私は客観的には何も確信していません...

+0

いくつかのコードが必要です。あなたのコードはどのように設定されていますか?ビューにはカスタム画層がありますか?ビューを複数のレイヤーへのデリゲートとして設定していますか? – pe8ter

+0

@ pe8ter空のプロジェクトを作成し、マイナーコードを挿入して問題を再現します。ここでそれを見ることができます:[リンク](http://pastebin.com/cEVNjgwR) – Speakus

+0

あなたは明示的に例外をスローしています。どうして? – pe8ter

答えて

4

CALayerのデフォルトのdrawInContext:は何もしません。レイヤの代理人がdrawLayer:inContext:を実装する代理人を持たない限り、これは真です。したがって、ドキュメントの問題は、「デフォルトの実装では何もしません」というステートメントの横に小さなアスタリスクを付けることです。

すべてのビューは、何らかの種類のCALayerでサポートされています。このレイヤーは自動的に設定され、ビューがデリゲートとして設定されます。表面上明白でないのは、UIViewがCALayerのデリゲートdrawLayer:inContext:を実装しているということです。これは、コールスタック上のすべてのコールで表示されます。

インスタンスのAlarmIntervalViewは自動的にバッキングレイヤーを持ち、そのバッキングレイヤーはAlarmIntervalViewインスタンスにデリゲートを設定します。システムのいくつかの部分は、バッキング層のdrawInContext:(それが持っている)代理人のためにチェックするを呼び出します(UIViewのが応答し)の引数としてdrawLayer:inContext:でデリゲートrespondsToSelector:を送り、最後に実際にメッセージdrawLayer:inContext:を送信します。 drawLayer:inContext:のUIViewの実装では、ビューのdrawRect:が呼び出されます。

なぜ私がスウィズルを言うのかは分かりません。

[私の反応は長く、ほとんどの場合私の利益のためです。それは私にも学ぶのに役立ちます。]