2011-04-28 11 views
5

Quiero aplicar inner-shadow a un UILabel. Tengo una solución, pero no es lo suficientemente buena. ¿Alguien con una mejor solución?Aplicar inner-shadow a UILabel

// UILabel subclass 

- (void) drawTextInRect:(CGRect)rect { 
    CGSize myShadowOffset = CGSizeMake(0, 2); 
    float myColorValues[] = {255, 0, 0, 1}; 

    CGContextRef myContext = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(myContext); 

    CGColorSpaceRef myColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGColorRef myColor = CGColorCreate(myColorSpace, myColorValues); 

    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor); 
    CGContextSetBlendMode(myContext, kCGBlendModeLighten); 

    [super drawTextInRect:rect]; 

    CGColorRelease(myColor); 
    CGColorSpaceRelease(myColorSpace); 

    CGContextRestoreGState(myContext); 
} 

estoy familiarizado con la propiedad de capa de UILabel, pero shadow offset nos da una sombra exterior, NO del centro de la sombra (a menos que me falta algo).

+0

¿Has probado los valores negativos en myShadowOffset? – adam

Respuesta

4

Intenté hacer esto pero finalmente opté por usar el valor predeterminado shadowOffset y jugar con el shadowColor para dar el efecto de sombreado interno al texto. En textos pequeños te da un buen efecto de sombra interior. Por ejemplo, si tiene un fondo grisColor y aplica un colorColor a la sombra, entonces tiene un efecto de sombra interior aceptable.

A veces, es mejor diseñar esos textos con herramientas gráficas y hacer copias localizadas si es necesario.

21

de emisión en la respuesta de Ruben anterior, si lo hace a la inversa, es decir. establece el color del texto igual al color de fondo (con bajo alfa) y luego configura la sombra para que tenga un color más fuerte, crea un efecto de inserción decente. Esto es lo que quiero decir (Nota: Mi opinión del fondo es de color blanco):

cell.textLabel.textColor  = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.5]; 
cell.textLabel.shadowColor = [UIColor darkGrayColor]; 
cell.textLabel.shadowOffset = CGSizeMake(-1.0,-1.0); 
[cell.textLabel setText:@"Welcome to MyApp!"]; 

y esto es la salida

inset UILabel text

Esto probablemente sólo funcionan en los fondos muy ligeros como sospecho que va a crear superposición no deseada en fondos más oscuros.

Por supuesto, puede variar el shadowOffset para cambiar la dirección de la luz.

+0

Muy simple, una gran solución. – Nik