2013-04-13 11 views
7

Non riesco a capire perché il CALayer che sto creando non stia chiamando il metodo drawLayer. Ho creato un oggetto delegato drawLayer per loro, ma non viene mai chiamato. Da una sottoclasse UIView:I CALayer non chiamano mai drawLayer del delegato: inContext: anche dopo [layer setNeedsDisplay] e [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 ho:

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

Ho provato molte cose diverse. Ho provato a impostare setNeedsDisplay su self.bg.layer, ho provato setNeedsDisplay su self.bg, ho provato [layer setNeedsDisplay] prima di AND dopo addSublayer, ho provato [layer display] prima e dopo addSublayer. Ho provato con e senza [display layer] e [layer displayIfNeeded].

Perché il layer si rifiuta di disegnare?

risposta

3

Hai implementato questo metodo nel delegato del tuo livello? Se SÌ, verrà chiamato questo metodo del proprio livello delegato.

- (void)displayLayer:(CALayer *)layer 

Se leggete la documentazione di Apple per setNeedsDisplay si dice chiaramente che

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

Non si dovrebbe implementare displayLayer se non si desidera impostare il contenuto del livello direttamente e piuttosto vuole richiamare il contenuto della strato. È quindi possibile eseguire il disegno in drawLayer: inContext: metodo che dovrebbe essere richiamato.

+0

Non sapevo di questo metodo. L'ho messo nel mio delegato, e in effetti viene chiamato. tuttavia drawLayer non viene chiamato. Dovrei chiamarlo manualmente da displayLayer? – zakdances

+0

non leggere la mia risposta aggiornata. – msk

+0

Non avendo definito il metodo displayLayer, il problema non è stato risolto. Ma l'ho capito. Vedi la mia risposta sopra. – zakdances

9

Il frame del livello deve essere diverso da zero. Questo risolve il problema:

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