iphone objective-c iphone-sdk-3.0 uilabel shadow

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()



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.

https://github.com/MuscleRumble/THLabel


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.