2011-08-09 4 views
7

내 텍스트의 채우기 색상에 대한 그래디언트를 만들고 싶습니다. 현재 내가[UIColor colorWithPatternImage :]를 사용하여 텍스트의 그래디언트 채우기 만들기

GradientFillImage.png가에 그려진 직선 기울기와 간단한 이미지 파일입니다
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

방금 ​​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

관련 문제