2011-08-09 9 views
7

Chcę utworzyć gradient dla koloru wypełnienia mojego tekstu. Obecnie robię to przez ustawienie koloru tekstu w UILabel jakoTworzenie wypełnienia gradientowego dla tekstu za pomocą [UIColor colorWithPatternImage:]

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

Gdzie jest prosty plik obrazu z gradientem liniowym malowane na nim.

Działa to dobrze, dopóki nie chcę zmienić rozmiaru czcionki. Ponieważ plik obrazu ma stałe wymiary i nie zmienia rozmiaru po zmianie rozmiaru czcionki, wypełnienie gradientowe czcionki zostaje pomieszane. Jak utworzyć niestandardowy wzór wzoru i zastosować go jako wzór wypełnienia dla tekstu?

Odpowiedz

2

Ok, wymyśliłem to. Zasadniczo możemy zastąpić drawRectInText i użyć własnego wzoru, aby pokolorować wypełnienie. Zaletą tego jest to, że możemy zmienić rozmiar obrazu w naszą ramkę.

Najpierw tworzymy obiekt CGPattern i definiujemy wywołanie zwrotne w celu narysowania wzoru. Przekazujemy również rozmiar etykiety jako parametr w wywołaniu zwrotnym. Następnie za pomocą wzoru, który jest sporządzony w zwrotnego i ustawienie go jako koloru wypełnienia tekstem:

- (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]; 
} 

Wywołanie zwrotne rysuje obraz do kontekstu. Rozmiar obrazu jest zmieniany zgodnie z rozmiarem ramki przekazywanej do wywołania zwrotnego.

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

Właśnie ukończyłem rozszerzenie klasy UIColor, które sprawia, że ​​jest to 1 wiersz + blok.

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

Dobra robota @bigkm. To zdecydowanie dodaje łatwe w użyciu opakowanie wokół jakiegoś niechlujnego kodu. – windson