Gradientes en UIView y UILabels en iPhone

Posible duplicado:
Dibujando manualmente un gradiente en las aplicaciones de iPhone?

Mi aplicación necesita mostrar texto en UIView o UILabel pero el segundo UILabel debe ser un degradado en comparación con un UIColor verdadero. No es bueno usar un progtwig de gráficos para crear el aspecto deseado, ya que el texto puede variar según los datos devueltos por un servidor.

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

También podría usar una imagen gráfica de un píxel de ancho como gradiente y establecer la propiedad de vista para expandir el gráfico y llenar la vista (suponiendo que está pensando en un degradado lineal simple y no en algún tipo de gráfico radial).

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

A partir de iPhone SDK 3.0, los degradados personalizados se pueden implementar muy fácilmente, sin crear subclases o 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 CAGradientLayer. Opcionalmente, puede especificar puntos de inicio y fin (en caso de que no desee un degradado lineal que vaya directamente de arriba a abajo) o incluso ubicaciones específicas que se correspondan con cada uno de los colores.

Puede usar Core Graphics para dibujar el degradado, como se señala en la respuesta de Mike. Como un ejemplo más detallado, puede crear una subclase UIView para usar como fondo para su UILabel . En esa subclase UIView , anule el método drawRect: 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 particular crea un degradado de color blanco shiny que se dibuja desde la parte superior de UIView hasta su centro vertical. Puede establecer UIView de UIView a su gusto y este brillo se dibujará sobre ese color. También puede dibujar un degradado radial utilizando la función CGContextDrawRadialGradient .

Solo necesita UIView tamaño de esta UIView adecuada y agregar su UILabel como una subvista para obtener el efecto que desea.

EDITAR (23/04/2009): por sugerencia de St3fan, he reemplazado el marco de la vista con sus límites en el código. Esto corrige para el caso cuando el origen de la vista no es (0,0).

Cuando se usa CAGradientLayer , a diferencia de CGGradient , el gradiente no es uniforme, pero tiene un CGGradient notable en él. Ver este ejemplo :

Para obtener resultados más atractivos, es mejor usar CGGradient .

La respuesta de Mirko Froehlich funcionó para mí, excepto cuando quería usar colores personalizados. El truco consiste en especificar el color de la interfaz de usuario con tono, saturación y brillo en lugar de RGB.

 CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = myView.bounds; UIColor *startColour = [UIColor colorWithHue:.580555 saturation:0.31 brightness:0.90 alpha:1.0]; UIColor *endColour = [UIColor colorWithHue:.58333 saturation:0.50 brightness:0.62 alpha:1.0]; gradient.colors = [NSArray arrayWithObjects:(id)[startColour CGColor], (id)[endColour CGColor], nil]; [myView.layer insertSublayer:gradient atIndex:0]; 

Para obtener el tono, la saturación y el brillo de un color, use el selector de color xcode incorporado y vaya a la pestaña HSB. El matiz se mide en grados en esta vista, por lo tanto, divida el valor entre 360 ​​para obtener el valor que desea ingresar en el código.

Esto es lo que obtuve trabajando: configure UIButton en xCode’s IB como transparent / clear, y no bg image.

 UIColor *pinkDarkOp = [UIColor colorWithRed:0.9f green:0.53f blue:0.69f alpha:1.0]; UIColor *pinkLightOp = [UIColor colorWithRed:0.79f green:0.45f blue:0.57f alpha:1.0]; CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = [[shareWordButton layer] bounds]; gradient.cornerRadius = 7; gradient.colors = [NSArray arrayWithObjects: (id)pinkDarkOp.CGColor, (id)pinkLightOp.CGColor, nil]; gradient.locations = [NSArray arrayWithObjects: [NSNumber numberWithFloat:0.0f], [NSNumber numberWithFloat:0.7], nil]; [[recordButton layer] insertSublayer:gradient atIndex:0]; 

Logro esto en una vista con una subvista que es un UIImageView. La imagen a la que apunta ImageView es un degradado. Luego establezco un color de fondo en UIView, y tengo una vista de gradiente de color. A continuación, uso la vista como lo necesito y todo lo que dibuje estará bajo esta vista de degradado. Al agregar una segunda vista en la parte superior de ImageView, puede tener algunas opciones, ya sea que su dibujo esté por debajo o por encima del degradado …

    Intereting Posts