2015-05-15 42 views
2

我很困惑,爲什麼下面的代碼工作,如果我把它添加到awakeFromNibinitWithFrame:,但不工作,如果我將它添加到drawRect:或直接調用它?CALayer in awakeFromNib vs drawRect

self.layer.cornerRadius = CGRectGetWidth(self.bounds)/2.0f; 
self.layer.shadowColor = [UIColor blackColor].CGColor; 
self.layer.shadowRadius = 3; 
self.layer.shadowOffset = CGSizeMake(0.0f, 0.0f); 
self.layer.shadowOpacity = 0.75f; 

對於編程創建的按鈕,我應該在哪裏這個方法添加到?該按鈕可能僅在init之後創建,並且大小稍後會通過約束進行更改。

規範:通過工作,我的意思是按鈕將圓角(如果長寬比爲1:1時爲圓形)並帶有陰影。不工作,我的意思是它仍然是一個正方形。

+0

你爲什麼要從'drawRect'調用它?你重寫該方法來繪製而不是思考。 – trojanfoe

+0

'對於編程式創建的按鈕,我應該在哪裏添加此方法?這個按鈕可能只是通過初始化和大小通過約束來改變。「 - 這就是爲什麼。還有,因爲我不知道還有什麼地方可以調用它:) –

+0

'drawRect:'在'init ...'&'awakeFromNib'之後被調用,直到窗口或視圖的圖層已經創建完畢。你再次需要更新它們。 –

回答

0

查看the Apple Docs中的詳細說明,但實質上是因爲您在繪圖循環的中間設置了圖層配置(cornerRadius,陰影等),因此您應該在繪圖循環開始前完成這些配置。

從的drawRect:文檔:

通過這種方法被調用的時候,UIKit中已經爲你的觀點正確配置的繪圖環境,你可以簡單地叫你需要渲染你的內容不論繪圖方法和功能。

其他功能,如awakeFromNib:initWithFrame:抽獎週期之前進行的,這意味着你的配置將考慮到它們在屏幕上呈現前。相比之下,drawRect:假設這些基本配置已經設置好了,只是在渲染你在屏幕上指定的內容時起作用。

相關問題