Comment appliquer CAGradientLayer en tant que masque d'un autre CALayer?

J'ai une vue, qui a un calayer. Lorsque je crée un CAGradientLayer et l'applique en tant que masque de CALayer de cette vue, rien ne se produit. Pourquoi?

In -initWithFrame: de la vue je fais ceci:

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 je remplace

 self.layer.mask = gradient; 

avec

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

alors je vois le dégradé. C'est du noir au blanc.

C'est quoi le truc?

La propriété de masque sur CALayer utilise la composante alpha de la couche de masque pour déterminer ce qui doit être visible et non. Puisque vos deux colors (noir et blanc) sont entièrement opaques (pas de transparence), le masque n'a aucun effet. Pour résoudre ce problème, vous devez replace l'une des colors par une couleur claire:

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

C'est le "truc": D