2011-08-09 86 views
7

我想爲我的文本的填充顏色創建漸變。目前,我通過設置UILabel的文本的顏色做它作爲使用[UIColor colorWithPatternImage:]爲文本創建漸變填充

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

哪裏是畫着一個線性漸變一個簡單的圖像文件。

這工作正常,直到我想調整字體大小。由於圖像文件具有恆定的尺寸,並且在調整字體大小時不會調整大小,因此字體的漸變填充會變得混亂。 如何創建自定義大小的圖案圖像並將其應用爲文本的填充圖案?

回答

2

好吧,我想通了。基本上,我們可以覆蓋drawRectInText並使用我們自己的模式來填充顏色。這樣做的好處是我們可以將圖像大小調整爲我們的模式框架。

首先我們創建一個CGPattern對象並定義一個回調來繪製模式。我們還將標籤的大小作爲參數傳遞給回調函數。然後,我們使用的是在回調繪製,並將其設置爲文本的填充顏色模式:

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

回調繪製圖像爲背景。根據傳入回調的幀大小調整圖像大小。

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

我剛剛完成了一個UIColor類擴展,這使得它成爲1行+塊的東西。

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

尼斯工作@bigkm。這絕對增加了一些易於使用的一些雜亂的代碼包裝。 – windson