2015-06-20 53 views
2

我有一個視圖控制器(MagmaViewController),它正在管理一個名爲MagmaView的視圖。對於MagmaView直接背襯層我已經指派我自己定製CALayer的子類,稱爲MagmaLayer通過將以下內容的MagmaView實現部分:在哪裏調用setNeedsDisplay以更新CALayer?

+ (Class)layerClass 
{ 
    return [MagmaLayer class]; 
} 

我有一些自定義的圖紙,我想MagmaLayer畫爲MagmaView,所以我將一些繪圖代碼放入MagmaLayer-(void) drawInContext:(CGContextRef) context方法中。問題是當我這樣做並運行模擬器時,MagmaView顯示爲空白。我在MagmaLayer-(void) drawInContext:(CGContextRef) context方法中設置了一個斷點,看起來這個方法根本沒有被調用。

顯然,我很困惑setNeedsDisplay命令的觸發畫圖的需求和位置。首先,我認爲,至少在CALayer的第一次出現時,如果CALayer是UIView的直接後備層,那麼不需要發出setNeedsDisplay命令,並且任何UIView都可以確保其直接支持層是正確的在需要時繪製,並且只有非直接的CALayer支撐層需要特別注意確保它們自己繪製。這不是嗎?另外,我應該在什麼地方放置setNeedsDisplay命令來使這個直接支持圖層MagmaLayer自己畫? setNeedsDisplay命令是否在MagmaView的初始化方法中,這是在此處承載MagmaLayer的視圖?或者我應該走進更遠的鏈條,並把setNeedsDisplay命令MagmaViewController,管理MagmaView的視圖控制器,例如,控制器的viewWillAppear方法?

回答

1

您需要告訴您的自定義圖層何時繪製。基本實現將不會自動調用-(void) drawInContext:(CGContextRef) context。基本設置是在圖層init方法中設置needsDisplayOnBoundsChange = YES。 如果你有自定義的屬性,應該觸發重繪,你將不得不實施/擴展+ (BOOL)needsDisplayForKey:(NSString *)key