¿Cómo aplicar CAGradientLayer como máscara de otro CALayer?

Tengo una vista, que tiene un CALayer. Cuando creo un CAGradientLayer y lo aplico como la máscara del CALayer de esa vista, no pasa nada. ¿Por qué?

En -initWithFrame: de la vista hago esto:

CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = self.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil]; //[self.layer insertSublayer:gradient atIndex:0]; self.layer.mask = gradient; 

Si reemploop

 self.layer.mask = gradient; 

con

 [self.layer insertSublayer:gradient atIndex:0]; 

luego veo el gradiente. Es de negro a blanco.

¿Cuál es el truco?

La propiedad de máscara en CALayer usa el componente alfa de la capa de máscara para determinar qué debe ser visible y qué no. Como sus dos colors (blanco y negro) son completamente opacos (sin transparencia), la máscara no tiene efecto. Para solucionarlo, debe cambiar uno de los colors a un color claro:

 gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor clearColor] CGColor], nil]; 

Ese es el "truco": D