¿Es posible dibujar text con sombras usando las adiciones NSString UIKit?

¿Es posible dibujar con sombras de text simples al usar las adiciones de NSString UIKit? Quiero decir sin escribir código para dibujar dos veces en dos colors, como se puede hacer con varias classs de UIKit como UILabel y sus properties shadowColor y shadowOffset , y también sin hacer sombras de sombras reales a través de CGContextSetShadow (que serán mucho más caras).

El documento de Apple para estas extensiones incluye constantes (en la parte inferior), incluyendo UITextAttributeTextShadowColor y UITextAttributeTextShadowOffset que implica que es posible, pero no veo ningún uso posible de estos en los methods reales.

Un par de pensamientos:

  1. Las keys UITextAttributeTextShadow... están pensadas para utilizar un dictionary de attributes de text con, por ejemplo, los methods UIAppearance :

     NSDictionary *attributes = @{UITextAttributeTextShadowColor : [UIColor blackColor], UITextAttributeTextShadowOffset : [NSValue valueWithUIOffset:UIOffsetMake(2.0, 0.0)], UITextAttributeTextColor : [UIColor yellowColor]}; [[UINavigationBar appearance] setTitleTextAttributes:attributes]; 

    Las keys UITextAttributeTextShadow... están diseñadas para usarse solo en aquellos methods que aceptan un dictionary de attributes de text.

  2. La key equivalente más cercana al dibujar cadenas de text es el uso de cadenas atribuidas con la key NSShadowAttributeName :

     - (void)drawRect:(CGRect)rect { UIFont *font = [UIFont systemFontOfSize:50]; NSShadow *shadow = [[NSShadow alloc] init]; shadow.shadowColor = [UIColor blackColor]; shadow.shadowBlurRadius = 0.0; shadow.shadowOffset = CGSizeMake(0.0, 2.0); NSDictionary *attributes = @{NSShadowAttributeName : shadow, NSForegroundColorAttributeName : [UIColor yellowColor], NSFontAttributeName : font}; NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"this has shadows" attributes:attributes]; [attributedText drawInRect:rect]; } 

    Si le preocupa el éxito de performance de un algorithm de sombra capaz de hacer una curva de la curva de bezier, sin embargo, NSShadow puede sufrir de eso. Pero al hacer algunos puntos de reference, cambiar el shadowBlurRadius afecta drásticamente el performance. Por ejemplo, animar la rotation de un text multilínea complejo con un shadowBlurRadius de 10.0 en un iPhone 3GS lento logró una velocidad de fotogtwigs de 31 fps, pero cambiar shadowBlurRadius a 0.0 produjo una velocidad de fotogtwigs de 60 fps.

    En la línea inferior, usar un radio de desenfoque de sombra de 0.0 elimina la mayoría (si no la totalidad) de la sobrecarga computacional de una sombra generada por bezier.

  3. Para su información, experimento una mejora de performance similar al establecer el valor de blur a 0.0 para CGContextSetShadow , al igual que experimenté con la representación de text atribuida anteriormente.

En pocas palabras, no creo que debas temer la sobrecarga computacional de las sombras basadas en bezier, siempre que uses un radio de desenfoque de 0.0 . No me sorprendería si escribir el text dos veces usted mismo, una vez para la sombra y otra vez para el color de primer plano, incluso podría ser un poco más eficiente, pero no estoy seguro si la diferencia será observable. Pero no conozco ninguna llamada a API que haga eso por usted (que no sea CGContextSetShadow con blur de 0.0 ).

El siguiente fragment usa CALayer para agregar sombra alnetworkingedor de los bordes de los caracteres en un UILabel:

  _helloLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)]; [_helloLabel setBackgroundColor:[UIColor clearColor]]; [_helloLabel setTextColor:[UIColor whiteColor]]; [_helloLabel setTextAlignment:NSTextAlignmentCenter]; [_helloLabel setFont:[UIFont lightApplicationFontOfSize:30]]; _helloLabel.layer.shadowColor = UIColorFromRGB(0xd04942).CGColor; _helloLabel.layer.shadowOffset = CGSizeMake(0, 0); _helloLabel.layer.shadowRadius = 2.0; _helloLabel.layer.shadowOpacity = 1.0; [self addSubview:_helloLabel]; 

. . normalmente esto agregaría una sombra alnetworkingedor del borde, pero UILabel parece tratar estas properties como un caso especial.