2011-08-09 9 views
7

テキストの塗りつぶし色のグラデーションを作成します。現在、私は[UIColor colorWithPatternImage:]を使用してテキストのグラデーション塗りを作成する

がそれに描かれた直線勾配でシンプルなイメージファイルである
UIImage *image = [UIImage imageNamed:@"GradientFillImage.png"]; 
myLabel.textColor = [UIColor colorWithPatternImage:image]; 

としてUILabelのテキストの色を設定することにより、それをやっています。

フォントのサイズを変更するまで、これはうまく動作します。イメージファイルのサイズは一定であり、フォントのサイズを変更するとサイズが変更されないため、フォントのグラデーションの塗りつぶしが狂ってしまいます。 カスタムサイズのパターンイメージを作成し、それをテキストの塗りつぶしパターンとして適用するにはどうすればよいですか?

答えて

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

私は、これを1行+ブロックのものにするUIColorクラス拡張を終えました。

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

関連する問題