2011-11-12 8 views
31

Tengo un UIButton aquí donde me gustaría tener un degradado como fondo debajo de la imagen (símbolo con fondo transparente), pero estoy enfrentando dos problemas diferentes.UIButton with GradientLayer oscurece la imagen y oscurece el degradado

Primero de CAGradientLayer parece superponerse en la parte superior de la imagen sin importar cómo intente agregarla, oscureciendo la imagen por completo.

En segundo lugar, el degradado en sí parece oscurecerse mucho, al igual que el botón se deshabilitó, que no lo es.

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]; 

Respuesta

61

Así que lograron evitar esto haciendo un [botón bringSubviewToFront: button.imageView] después de añadir el gradiente. Parece que no importa lo que haga, la nueva capa se agregará a la vista de la imagen, así que tengo que empujar eso al frente después.

+0

solución de Niza, gracias –

+0

perfectos, gracias – avdyushin

21

Alternativamente, puede insertar la capa de gradiente por debajo de la capa de la vista de la imagen

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

Literalmente ¡solo me salvó la vida! ;) La imagen no se mostró después de que agregué la capa con degradado porque la capa era, por supuesto, por encima de la capa de la imagen. Gracias – virusss8

1

SWIFT 3

aquí va un ejemplo: (Basado en Neil respuesta)

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) 

Feliz codificación :)

0

Swift 3

Usted puede mover la imagen por encima del gradiente:

contactButton.imageView?.layer.zPosition = 1 

o insertar el gradiente bajo la imagen:

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