2013-04-13 4 views
7

Ich kann nicht herausfinden, warum die CALayers, die ich erstelle, ihre drawLayer-Methode nicht aufrufen. Ich habe ein DrawLayer-Delegat-Objekt für sie erstellt, aber es wird nie aufgerufen. Aus einer UIView Unterklasse:CALayers ruft niemals die drawLayer des Delegates auf: inContext: selbst nach [layer setNeedsDisplay] und [layer display]

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 

     UIView *bg = [[UIView alloc] initWithFrame:self.bounds]; 
     // I have a property called 'bg' to reference the child UIView 
     self.bg = bg; 
     [self addSubview:self.bg]; 

     // an NSObject subclass I use as a CALayer delegate 
     MyLayerDelegate *drawer = [MyLayerDelegate new]; 
     self.drawer = drawer; 


     CAGradientLayer *layer = [CAGradientLayer layer];; 
     layer.delegate = self.drawer; 
     layer.name = @"bg"; 

     [self.bg.layer addSublayer:layer]; 

     [layer setNeedsDisplay]; 
     [layer display]; 

    } 
    return self; 
} 

In self.drawer ich habe:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context 
{ 
    NSLog(@"layer called drawLayer"); 
    // Some drawing goes here 
} 

ich viele verschiedene Dinge ausprobiert habe. Ich habe versucht setNeedsDisplay auf self.bg.layer, ich habe setNeedsDisplay auf self.bg versucht, ich habe [layer setNeedsDisplay] vor und nach dem addSublayer versucht, ich habe [layer display] vor und nach addSublayer versucht. Ich habe es mit und ohne [layer display] und [layer displayIfNeeded] ausprobiert.

Warum weigert sich die Schicht zu zeichnen?

Antwort

3

Wurde diese Methode in den Delegaten Ihrer Schicht implementiert? Wenn JA, wird diese Methode Ihres Schichtdelegaten aufgerufen.

- (void)displayLayer:(CALayer *)layer 

Wenn Sie die Apple-Dokumentation für setNeedsDisplay lesen eindeutig heißt es, dass

Calling this results in the layer potentially calling either the displayLayer: or drawLayer:inContext: method of its delegate. 

Sie sollten nicht Displaylayer implementieren, wenn Sie nicht wollen, Layer-Inhalt direkt eingestellt und eher den Inhalt zeichnen möchten Ihrer Schicht. Sie können dann die Zeichnung in drawLayer: inContext: Methode ausführen, die stattdessen aufgerufen werden soll.

+0

Ich wusste nicht über diese Methode. Ich lege es in meinen Delegierten und es wird tatsächlich angerufen. DrawLayer wird jedoch immer noch nicht aufgerufen. Soll ich es manuell von displayLayer aufrufen? – zakdances

+0

nicht meine aktualisierte Antwort lesen. – msk

+0

Wenn keine displayLayer-Methode definiert wurde, wurde das Problem nicht gelöst. Aber ich habe es herausgefunden. Siehe meine Antwort oben. – zakdances

9

Der Layerrahmen muss nicht Null sein. Dies löste das Problem:

layer.frame = self.bg.bounds; 
[layer setNeedsDisplay]; 
[self.bg.layer addSublayer:layer];