iPhone UILabel texto suave sombra
objective-c iphone-sdk-3.0 (14)
A partir de iOS 5, Apple proporciona un método de API privado para crear etiquetas con sombras suaves. Las etiquetas son muy rápidas: estoy usando docenas al mismo tiempo en una serie de vistas transparentes y no hay desaceleración en la animación de desplazamiento.
Esto solo es útil para aplicaciones que no son de la App Store (obviamente) y necesita el archivo de encabezado.
$SBBulletinBlurredShadowLabel = NSClassFromString("SBBulletinBlurredShadowLabel");
CGRect frame = CGRectZero;
SBBulletinBlurredShadowLabel *label = [[[$SBBulletinBlurredShadowLabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.font = [UIFont boldSystemFontOfSize:12];
label.text = @"I am a label with a soft shadow!";
[label sizeToFit];
Sé que las sombras suaves no son compatibles con UILabel de fábrica, en el iPhone. Entonces, ¿cuál sería la mejor manera de implementar el mío?
EDITAR:
Obviamente, voy a subclasificar el UILabel
y dibujar el -drawRect: Mi pregunta es, ¿cómo consigo el contenido de la etiqueta como gráficos y dibujar a su alrededor, desenfocarlos, etc ...
EDICION 2:
Volví a esta pregunta un año después. Mientras tanto, he creado una clase que te permite agregar fácilmente una sombra suave a una etiqueta y modificar su radio, etc. y también dibujar degradados en el texto mismo. Puede encontrarlo en GitHub: https://github.com/doukasd/iOS-Components/tree/master/Views
Además de la respuesta de IIDan: Para algunos fines, es necesario establecer
label.layer.shouldRasterize = YES
Creo que esto se debe al modo de fusión que se usa para representar la sombra. Por ejemplo, tenía un fondo oscuro y texto en blanco y quería "resaltar" el texto con un brillo oscuro y negro. No funcionó hasta que establecí esta propiedad.
Aplica la sombra (suave) en la capa de la vista, así:
UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;
Desde 3.2 hay soporte directo para sombras en el SDK.
label.layer.shadowColor = [label.textColor CGColor];
label.layer.shadowOffset = CGSizeMake(0.0, 0.0);
Importar <QuartzCore/QuartzCore.h>
y jugar con algunos parámetros:
label.layer.shadowRadius = 3.0;
label.layer.shadowOpacity = 0.5;
Y, si encuentra su sombra recortada por los límites de la etiqueta:
label.layer.masksToBounds = NO;
finalmente establecido
label.layer.shouldRasterize = YES
En Swift 3
, puedes crear una extensión:
import UIKit
extension UILabel {
func shadow() {
self.layer.shadowColor = self.textColor.cgColor
self.layer.shadowOffset = CGSize.zero
self.layer.shadowRadius = 3.0
self.layer.shadowOpacity = 0.5
self.layer.masksToBounds = false
self.layer.shouldRasterize = true
}
}
y usarlo a través de:
label.shadow()
Escribí una biblioteca que proporciona una subclase UILabel con soporte de sombras suaves y un montón de otros efectos:
Esto como un truco,
UILabel *customLabel = [[UILabel alloc] init];
UIColor *color = [UIColor blueColor];
customLabel.layer.shadowColor = [color CGColor];
customLabel.layer.shadowRadius = 5.0f;
customLabel.layer.shadowOpacity = 1;
customLabel.layer.shadowOffset = CGSizeZero;
customLabel.layer.masksToBounds = NO;
Intenté casi todas estas técnicas (excepto FXLabel) y no conseguí que ninguna de ellas funcionara con iOS 7. Eventualmente encontré THLabel, que funciona perfectamente para mí. Utilicé THLabel en Interface Builder y configuré los atributos de tiempo de ejecución definidos por el usuario para que a un programador no le resulte fácil controlar la apariencia.
Para mantener las cosas al día: Crear la sombra en Swift es tan fácil como eso:
Importar el Marco QuartzCore
import QuartzCore
Y establece los atributos de sombra en tu etiqueta
titleLabel.shadowColor = UIColor.blackColor()
titleLabel.shadowOffset = CGSizeMake(0.0, 0.0)
titleLabel.layer.shadowRadius = 5.0
titleLabel.layer.shadowOpacity = 0.8
titleLabel.layer.masksToBounds = false
titleLabel.layer.shouldRasterize = true
Subclase UILabel y sobrescribir -drawInRect:
Subclase UILabel, como se indicó, entonces, en drawRect :, do [self drawTextInRect:rect];
para obtener el texto dibujado en el contexto actual. Una vez que está allí, puedes comenzar a trabajar agregando filtros y otras cosas. Si desea crear una sombra paralela con lo que acaba de dibujar en el contexto, debería poder usar:
CGContextSetShadowWithColor()
Busque esa función en los documentos para aprender a usarla.
Te aconsejo que uses las propiedades shadowColor y shadowOffset de UILabel:
UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
Esta respuesta a esta pregunta similar proporciona un código para dibujar una sombra borrosa detrás de un UILabel. El autor usa CGContextSetShadow () para generar la sombra del texto dibujado.
_nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_nameLabel.font = [UIFont boldSystemFontOfSize:19.0f];
_nameLabel.textColor = [UIColor whiteColor];
_nameLabel.backgroundColor = [UIColor clearColor];
_nameLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.2];
_nameLabel.shadowOffset = CGSizeMake(0, 1);
Creo que deberías usar [UIColor colorWithWhite: 0 alpha: 0.2] para establecer el valor alfa.