2010-10-27 55 views
3

我有我自己的最小視圖類這樣的:drawLayer:inContext的不叫

- (void) awakeFromNib 
{ 
    NSLog(@"awakeFromNib!"); 
    [self.layer setDelegate:self]; 
    [self.layer setFrame:CGRectMake(30, 30, 250, 250)]; 
    self.layer.masksToBounds = YES; 
    self.layer.cornerRadius = 5.0; 
    self.layer.backgroundColor = [[UIColor redColor] CGColor]; 
    [self setNeedsDisplay]; 
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    NSLog(@"drawing!"); 
} 

drawLayer:inContext的永遠不會叫,但我可以看到該層爲紅色,圓角矩形。我錯過了什麼?

編輯:蘋果文檔

可以繪製的內容爲你的層, 或更好的封裝通過創建實現的 下列方法之一 委託類設置 層的內容畫面:DisplayLayer中: 或drawLayer:inContext :.

實現委託方法繪製 內容不會自動 導致圖層使用該實現進行繪製。相反,你必須 明確地告訴了一層實例 重新緩存中的內容,或者通過 發送一個setNeedsDisplay或 setNeedsDisplayInRect:消息,或者通過 其needsDisplayOnBoundsChange 屬性設置爲YES。

而且

drawLayer:inContext的:

如果定義,缺省實現drawInContext的 稱爲:。

回答

9

你不應該改變一個UIView層的委託。從UIView的層屬性的文件:

警告:因爲視圖是層的 代表,你永遠不應該設置 視圖作爲另一個的CALayer 對象的委託。此外,您不應該更改此圖層的代表 。

如果您想在視圖中進行自定義繪製,只需重寫drawRect:方法即可。

如果你想使用你需要圖層創建自己:

UIView *myView = ... 
CALayer *myLayer = [CALayer layer]; 
myLayer.delegate = self; 
[myView.layer addSublayer:myLayer]; 

在您需要調用setNeedsDisplay在第一種情況下,並在第二個自定義層視圖兩種情況。您從不直接調用drawRect:或drawLayer:inContext:當您調用setNeedsDisplay時,它們會自動調用。