2012-01-11 80 views
0

According to documentation 默認實現什麼都不做。確實 - [CALayer drawInContext:]做些什麼?

但是......我從的drawRect方法拋出異常,我看到旁邊調用堆棧

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

所以我能理解它的意思的默認實現 - [CALayer的drawInContext:]調用 委託方法。 這是正確的嗎? 因爲我知道swizzling技術我不知道什麼在目標c ...

+0

需要看一些代碼。你的代碼如何設置?該視圖是否具有自定義圖層?你是否將視圖設置爲多個圖層的代表? – pe8ter 2012-01-11 03:02:42

+0

@ pe8ter我創建空項目並插入次要代碼以重現問題。你可以在這裏看看:[鏈接](http://pastebin.com/cEVNjgwR) – Speakus 2012-01-11 22:46:58

+0

你正在拋出一個異常。爲什麼? – pe8ter 2012-01-12 01:31:34

回答

4

你是對的,CALayer的默認drawInContext:什麼都不做。這是真的,除非圖層具有代表該層的代表實現drawLayer:inContext:。所以這個文檔的問題是它應該在聲明「Default implementation does not nothing」旁邊有一個星號。

請記住,所有視圖都支持某種CALayer。該圖層自動設置爲將其視圖設置爲其代表。表面上看不出來的是,UIView確實實現了CALayer的代表drawLayer:inContext:。這就是您在調用堆棧上的所有調用中看到的內容。

您的AlarmIntervalView實例自動具有支持層,並且該支持層將其委託設置爲您的AlarmIntervalView實例。系統的某些部分調用支持層的drawInContext:,它檢查代理(它有),發送代表respondsToSelector:作爲參數(UIView確實響應),最後實際發送消息drawLayer:inContext:。 UIView的drawLayer:inContext:的實現調用您的視圖的drawRect:

我不是很確定你爲什麼提到swizzling。

[我的回覆很長,主要是爲了我的好處。它也幫助我學習。]