2011-02-23 25 views
6

Me preguntaba cómo puedo crear trazo de texto para UILabel? hay alguna manera posible? enter image description hereuilabel con contorno o trazo

gracias,

#import <Foundation/Foundation.h> 


@interface CustomLabel : UILabel { 

} 

@end 

#import "CustomLabel.h" 


@implementation CustomLabel 

- (void)drawTextInRect:(CGRect)rect { 

    CGSize shadowOffset = self.shadowOffset; 
    UIColor *textColor = self.textColor; 

    CGContextRef c = UIGraphicsGetCurrentContext(); 
    CGContextSetLineWidth(c, 22); 

    CGContextSetTextDrawingMode(c, kCGTextStroke); 
    self.textColor = [UIColor whiteColor]; 
    [super drawTextInRect:rect]; 

    CGContextSetTextDrawingMode(c, kCGTextFill); 
    self.textColor = textColor; 
    self.shadowOffset = CGSizeMake(0, 0); 
    [super drawTextInRect:rect]; 

    self.shadowOffset = shadowOffset; 
    //works fine with no warning 
} 

ahora la pregunta es ¿cómo puedo usar esta subclase con una etiqueta IBOutlet en diferentes viewcontrollers. ¿es correcto:

label = [[CustomLabel alloc] initWithFrame:CGRectMake(0, 0, 190, 190)]; 
+0

¿Por qué no intenta crear 'label' en Interface Builder y hacer las conexiones para que su aplicación haga la menor cantidad de trabajo? – Lynn

+0

Gracias :) Estaba confundido: D ahora funciona muy bien – Momi

+0

¡Gracias! ¡Gran idea! Todavía tiene que ser parametrizado, como el ancho de línea, el color, etc. – Bogdan

Respuesta

3

Puede ser útil a ello para añadir que, dependiendo de la fuente y los personajes, añadiendo:

CGContextSetLineJoin(c,kCGLineJoinRound); 

puede evitar artefactos de demasiado grande un golpe aplicado a demasiado fuerte carácter.

0

Hay un problema con esta implementación. Dibujar un texto con trazo tiene un ancho de glifo de carácter ligeramente diferente que dibujar un texto sin trazo, que puede producir resultados "no centrados". Puede solucionarlo agregando un trazo invisible alrededor del texto de relleno.

Debe reemplazar:

CGContextSetTextDrawingMode(c, kCGTextFill); 
self.textColor = textColor; 
self.shadowOffset = CGSizeMake(0, 0); 
[super drawTextInRect:rect]; 

con:

CGContextSetTextDrawingMode(context, kCGTextFillStroke); 
self.textColor = textColor; 
[[UIColor clearColor] setStroke]; // invisible stroke 
self.shadowOffset = CGSizeMake(0, 0); 
[super drawTextInRect:rect]; 

No estoy seguro al 100%, si ese es el verdadero negocio, porque no sé si self.textColor = textColor; tiene el mismo efecto como [textColor setFill], pero ya entiendes.

Revelación: Soy el desarrollador de THLabel.

He lanzado una subclase UILabel hace un tiempo, lo que permite un esquema en texto y otros efectos. Puede encontrarlo aquí: https://github.com/tobihagemann/THLabel