CALayers nunca llama a su delegado drawLayer: inContext: incluso después de y

No puedo entender por qué los CALayer que estoy creando no llaman al método drawLayer. He creado un object drawLayer delegado para ellos, pero nunca se llama. Desde una subclass UIView:

- (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; } 

En self.drawer tengo:

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

He probado muchas cosas diferentes. He intentado configurar setNeedsDisplay en self.bg.layer, he intentado setNeedsDisplay en self.bg, he probado [layer setNeedsDisplay] antes de AND después de addSublayer, he intentado [mostrar capa] antes y después de addSublayer. He intentado con y sin [mostrar capa] y [mostrar capa necesitado].

¿Por qué la capa se niega a dibujar?

El marco de la capa debe ser distinto de cero. Esto resolvió el problema:

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

¿Has implementado este método en el delegado de tu capa? En caso afirmativo, se llamará a este método de su delegado de capa.

 - (void)displayLayer:(CALayer *)layer 

Si lee la documentation de Apple para setNeedsDisplay, dice claramente que

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

No debe implementar displayLayer si no desea establecer el contenido de Layer directamente y, más bien, desea dibujar el contenido de su capa. A continuación, puede hacer el dibujo en drawLayer: inContext: método que debería llamarse en su lugar.