2011-08-09 18 views
7

Quiero crear un degradado para el color de relleno de mi texto. Actualmente lo estoy haciendo por establecer el color del texto de un UILabel comoCrear un relleno de degradado para texto usando [UIColor colorWithPatternImage:]

UIImage *image = [UIImage imageNamed:@"GradientFillImage.png"]; 
myLabel.textColor = [UIColor colorWithPatternImage:image]; 

Dónde es un archivo de imagen simple con un gradiente lineal pintado en él.

Esto funciona bien hasta que quiera cambiar el tamaño de la fuente. Como el archivo de imagen tiene dimensiones constantes y no cambia de tamaño cuando cambio el tamaño de la fuente, el relleno de degradado de la fuente se arruina. ¿Cómo creo una imagen de patrón de tamaño personalizado y la utilizo como un patrón de relleno para texto?

Respuesta

2

Ok, lo descubrí. Básicamente, podemos anular drawRectInText y usar nuestro propio patrón para colorear el relleno. La ventaja de hacer esto es que podemos cambiar el tamaño de la imagen en nuestro marco de patrón.

Primero creamos un objeto CGPattern y definimos una devolución de llamada para dibujar el patrón. También pasamos el tamaño de la etiqueta como parámetro en la devolución de llamada. A continuación, utilizamos el patrón que se dibuja en la devolución de llamada y establecerla como el color de relleno del texto:

- (void)drawTextInRect:(CGRect)rect 
{ 
    //set gradient as a pattern fill 
    CGRect info[1] = {rect}; 
    static const CGPatternCallbacks callbacks = {0, &drawImagePattern, NULL}; 
    CGAffineTransform transform = CGAffineTransformMakeScale(1.0, -1.0); 

    CGPatternRef pattern = CGPatternCreate((void *) info, rect, transform, 10.0, rect.size.height, kCGPatternTilingConstantSpacing, true, &callbacks); 
    CGColorSpaceRef patternSpace = CGColorSpaceCreatePattern(NULL); 
    CGFloat alpha = 1.0; 
    CGColorRef patternColorRef = CGColorCreateWithPattern(patternSpace, pattern, &alpha); 
    CGColorSpaceRelease(patternSpace); 
    CGPatternRelease(pattern); 
    self.textColor = [UIColor colorWithCGColor:patternColorRef]; 
    self.shadowOffset = CGSizeZero; 
    [super drawTextInRect:rect]; 
} 

La devolución de llamada dibuja la imagen en el contexto. La imagen cambia de tamaño según el tamaño de fotograma que se pasa a la devolución de llamada.

void drawImagePattern(void *info, CGContextRef context) 
{ 
    UIImage *image = [UIImage imageNamed:@"FontGradientPink.png"]; 
    CGImageRef imageRef = [image CGImage]; 
    CGRect *rect = info; 
    CGContextDrawImage(context, rect[0], imageRef); 
} 
4

acabo de terminar una extensión de clase UIColor que hace esto una cosa 1 línea + bloque.

https://github.com/bigkm/UIColor-BlockPattern

CGRect rect = CGRectMake(0.0,0.0,10.0,10.0); 

[UIColor colorPatternWithSize:rect.size andDrawingBlock:[[^(CGContextRef c) { 
    UIImage *image = [UIImage imageNamed:@"FontGradientPink.png"]; 
    CGContextDrawImage(context, rect, [image CGImage]); 
} copy] autorelease]]; 
+0

Niza @bigkm trabajo. Esto definitivamente agrega una envoltura fácil de usar alrededor de un código desordenado. – windson

Cuestiones relacionadas