Degradados en UIView y UILabels en iPhone [duplicado]
Posible duplicado:
¿Dibujar manualmente un degradado en aplicaciones de iPhone?
Mi aplicación necesita mostrar texto en a UIView
o UILabel
pero 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.
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.
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 UIView
subclase para usarla como fondo de su archivo UILabel
. En esa UIView
subclase, 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 UIView
hasta su centro vertical. Puedes configurar los UIView
's backgroundColor
como quieras y este brillo se dibujará encima de ese color. También puedes dibujar un degradado radial usando la CGContextDrawRadialGradient
función.
Solo necesita dimensionar esto UIView
adecuadamente y agregarlo UILabel
como 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).