UIButton con GradientLayer oculta la image y oscurece el gradiente

Tengo un button UIB aquí donde me gustaría tener un degradado como background debajo de la image (símbolo con background transparente), pero me enfrento a dos problemas diferentes.

Primero, el CAGradientLayer parece superponerse sobre la image, no importa cómo bash agregarlo, oscureciendo completamente la image.

En segundo lugar, el degradado mismo parece oscurecerse mucho, como si el button estuviera deshabilitado, lo que no es así.

Aquí está mi código:

self.backButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 35, 28, 28)]; [backButton addTarget:self action:@selector(goBack) forControlEvents:UIControlEventTouchUpInside]; [backButton setBackgroundColor:[UIColor clearColor]]; CAGradientLayer *buttonGradient = [CAGradientLayer layer]; buttonGradient.frame = backButton.bounds; buttonGradient.colors = [NSArray arrayWithObjects: (id)[[UIColor colorWithRed:.0 green:.166 blue:.255 alpha:1] CGColor], (id)[[UIColor colorWithRed:.0 green:.113 blue:.255 alpha:1] CGColor], nil]; [buttonGradient setCornerRadius:backButton.frame.size.width / 2]; [backButton.layer insertSublayer:buttonGradient atIndex:0]; [backButton setImage:[UIImage imageNamed:@"backarrow.png"] forState:UIControlStateNormal]; [backButton setEnabled:NO]; [topbarView addSubview:backButton]; 

Así que logré evitar esto haciendo un [button bringSubviewToFront: button.imageView] después de agregar el gradiente. Parece que no importa lo que hago, la nueva capa se agregará a la parte superior de imageView, por lo que tengo que empujarla hacia adelante.

Alternativamente, puede insert la capa de degradado debajo de la capa de la vista de la image

 CAGradientLayer* gradient = [CAGradientLayer layer]; // ... [button.layer insertSublayer:gradient below:button.imageView.layer]; 

SWIFT 3

Aquí va un ejemplo: (Basado en la respuesta de Neil)

  let layer = CAGradientLayer() layer.frame = CGRect(x: 0, y: 0, width: myButtonOutlet.layer.frame.size.width, height: myButtonOutlet..layer.frame.size.height) layer.colors = [UIColor.white.cgColor, pixelColorReceta.cgColor] layer.masksToBounds = true layer.cornerRadius = myButtonOutlet.layer.cornerRadius myButtonOutlet.layer.insertSublayer(layer, below: myButtonOutlet..imageView?.layer) 

Codificación feliz 🙂

Swift 3

Puede mover la image por encima del gradiente:

 contactButton.imageView?.layer.zPosition = 1 

o inserte el degradado debajo de la image:

 button.layer.insertSublayer(gradientLayer, below: button.imageView?.layer)