Degradados en UIView y UILabels en iPhone [duplicado]

Resuelto TonyNeallon asked hace 54 años • 7 respuestas

Posible duplicado:
¿Dibujar manualmente un degradado en aplicaciones de iPhone?

Mi aplicación necesita mostrar texto en a UIViewo UILabelpero el fondo debe ser un degradado en lugar de verdadero UIColor. Usar un programa de gráficos para crear la apariencia deseada no es bueno ya que el texto puede variar dependiendo de los datos devueltos por un servidor.

¿Alguien sabe la forma más rápida de abordar esto? Tus pensamientos son muy apreciados.

TonyNeallon avatar Jan 01 '70 08:01 TonyNeallon
Aceptado

Me doy cuenta de que este es un hilo antiguo, pero para referencia futura:

A partir del iPhone SDK 3.0, los degradados personalizados se pueden implementar muy fácilmente, sin subclases ni imágenes, utilizando el nuevo CAGradientLayer:

 UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease];
 CAGradientLayer *gradient = [CAGradientLayer layer];
 gradient.frame = view.bounds;
 gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil];
 [view.layer insertSublayer:gradient atIndex:0];

Eche un vistazo a los documentos de CAGradientLayer. Opcionalmente, puedes especificar puntos de inicio y fin (en caso de que no quieras un degradado lineal que vaya directamente de arriba a abajo), o incluso ubicaciones específicas que se asignen a cada uno de los colores.

Mirko Froehlich avatar Dec 19 '2009 00:12 Mirko Froehlich

Puede usar Core Graphics para dibujar el degradado, como se indica en la respuesta de Mike. Como ejemplo más detallado, podría crear una UIViewsubclase para usarla como fondo de su archivo UILabel. En esa UIViewsubclase, anule el drawRect:método e inserte un código similar al siguiente:

- (void)drawRect:(CGRect)rect 
{
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    CGGradientRef glossGradient;
    CGColorSpaceRef rgbColorspace;
    size_t num_locations = 2;
    CGFloat locations[2] = { 0.0, 1.0 };
    CGFloat components[8] = { 1.0, 1.0, 1.0, 0.35,  // Start color
         1.0, 1.0, 1.0, 0.06 }; // End color

    rgbColorspace = CGColorSpaceCreateDeviceRGB();
    glossGradient = CGGradientCreateWithColorComponents(rgbColorspace, components, locations, num_locations);

    CGRect currentBounds = self.bounds;
    CGPoint topCenter = CGPointMake(CGRectGetMidX(currentBounds), 0.0f);
    CGPoint midCenter = CGPointMake(CGRectGetMidX(currentBounds), CGRectGetMidY(currentBounds));
    CGContextDrawLinearGradient(currentContext, glossGradient, topCenter, midCenter, 0);

    CGGradientRelease(glossGradient);
    CGColorSpaceRelease(rgbColorspace); 
}

Este ejemplo en particular crea un degradado blanco de estilo brillante que se dibuja desde la parte superior UIViewhasta su centro vertical. Puedes configurar los UIView's backgroundColorcomo quieras y este brillo se dibujará encima de ese color. También puedes dibujar un degradado radial usando la CGContextDrawRadialGradientfunción.

Solo necesita dimensionar esto UIViewadecuadamente y agregarlo UILabelcomo una subvista para obtener el efecto que desea.

EDITAR (23/4/2009): Según la sugerencia de St3fan, he reemplazado el marco de la vista con sus límites en el código. Esto corrige el caso en el que el origen de la vista no es (0,0).

Brad Larson avatar Jan 07 '2009 21:01 Brad Larson