2012-05-14 6 views
12

Estoy trabajando en la creación de botones UI de aspecto elegante añadiendo gradiente lineal al botón. Sin embargo, no estoy seguro de qué índice necesito para agregar el degradado. El código que tengo actualmente coloca el degradado sobre la imagen/texto.iPhone iOS cómo agregar gradiente lineal a un UIButton debajo del texto o la imagen del botón?

¿Cómo puedo insertar una subcapa en un UIButton debajo de la subcapa de texto/imagen? ¡Es importante para mí mantener el texto y la imagen de un botón visible!

+(void)addLinearGradientToView:(UIView*)view TopColor:(UIColor*)topColor BottomColor:(UIColor*)bottomColor 
{ 
    for(CALayer* layer in view.layer.sublayers) 
    { 
     if ([layer isKindOfClass:[CAGradientLayer class]]) 
     { 
      [layer removeFromSuperlayer]; 
     } 
    } 
    CAGradientLayer* gradientLayer = [CAGradientLayer layer]; 

    gradientLayer.startPoint = CGPointMake(0.5, 0); 
    gradientLayer.endPoint = CGPointMake(0.5,1); 
    gradientLayer.frame = view.bounds; 
    gradientLayer.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil]; 
    // [view.layer addSublayer:gradientLayer]; 
    if(view.layer.sublayers.count>0) 
    { 
     [view.layer insertSublayer:gradientLayer atIndex:view.layer.sublayers.count-2]; 
    }else { 
     [view.layer addSublayer:gradientLayer]; 
    } 
} 
+0

He escrito algunos ejemplos de código para hacer este tipo de cosas: https://github.com/kristopherjohnson/gradientbuttons –

Respuesta

44

añadirlo a la capa de su botón de encargo:

CAGradientLayer *gradientLayer = [CAGradientLayer layer]; 
gradientLayer.frame = customButton.layer.bounds; 

gradientLayer.colors = [NSArray arrayWithObjects: 
         (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor, 
         (id)[UIColor colorWithWhite:0.4f alpha:0.5f].CGColor, 
         nil]; 

gradientLayer.locations = [NSArray arrayWithObjects: 
          [NSNumber numberWithFloat:0.0f], 
          [NSNumber numberWithFloat:1.0f], 
          nil]; 

gradientLayer.cornerRadius = customButton.layer.cornerRadius; 
[customButton.layer addSublayer:gradientLayer]; 

donde customButton es su costumbre UIButton.

+1

esta solución no funciona al 100%. Los botones obtienen un degradado, pero se desborda en las esquinas inferiores. Ver: https://www.dropbox.com/s/mguy6owuayjgxvc/Screen%20Shot%202012-09-03%20at%2017.50.30.png ¿Cómo se puede arreglar esto? – murze

+2

@murze Parece que su botón o su vista de contenedor no tiene la propiedad clipsToBounds = YES que se va a establecer. Esto cortará el desbordamiento que estás experimentando. – Luke

+1

[gradientLayer.masksToBounds = YES]; <- hazlo – stackOverFlew

9

Por lo que se está tratando de lograr, siempre inserte en el índice 0.

escribí an article sobre este tipo de cosas recientemente que puede resultar interesante.

+0

¡Gracias! Faltaba el texto después de agregar la capa de degradado, pero solo en iOS 6, iOS 7 todavía mostraba el texto. Después de cambiar a Insertar, ahora funciona para ambos. – KevinS

0

Este es el código para lograr este

CAGradientLayer *gradient = [CAGradientLayer layer]; 
gradient.frame = <#View Variable Name#>.bounds; 
gradient.colors = [NSArray arrayWithObjects:(id)([UIColor colorWithRed:0.337 green:0.596 blue:1.000 alpha:1.000].CGColor),(id)([UIColor colorWithRed:0.757 green:0.459 blue:1.000 alpha:1.000].CGColor),(id)([UIColor colorWithRed:0.310 green:0.835 blue:1.000 alpha:1.000].CGColor),nil]; 
gradient.startPoint = CGPointMake(0.5,0.0); 
gradient.endPoint = CGPointMake(0.5,1.0); 
[<#View Variable name#>.layer insertSublayer:gradient atIndex:0]; 

Tengo esta herramienta que hace que sea fácil de elegir sus colores y la salida automáticamente el código para el gradiente. Muy útil Lo uso todos los días itunes.apple.com/gb/app/gradient-creator/id1031070259?mt=12

Cuestiones relacionadas