2011-08-09 30 views
7

Tôi muốn tạo gradient cho màu tô của văn bản. Hiện nay tôi đang làm việc đó bằng cách thiết lập màu sắc của văn bản của một UILabel nhưTạo tô màu cho văn bản bằng cách sử dụng [UIColor colorWithPatternImage:]

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

đâu là một tập tin hình ảnh đơn giản với một linear gradient vẽ trên đó.

Tính năng này hoạt động tốt cho đến khi tôi muốn đổi kích thước phông chữ. Vì tệp hình ảnh có kích thước không đổi và không thay đổi kích thước khi tôi đổi kích thước phông chữ, việc tô màu gradient cho phông chữ sẽ bị rối tung lên. Làm cách nào để tạo hình ảnh có kích thước tùy chỉnh và áp dụng nó làm mẫu điền cho văn bản?

Trả lời

2

Ok, tôi đã tìm ra. Về cơ bản, chúng ta có thể ghi đè lên drawRectInText và sử dụng mẫu riêng của chúng tôi để tô màu tô màu. Ưu điểm của việc này là chúng ta có thể thay đổi kích thước hình ảnh vào khung mẫu của chúng ta.

Đầu tiên chúng ta tạo đối tượng CGPattern và xác định một cuộc gọi lại để vẽ mẫu. Chúng tôi cũng chuyển kích thước của nhãn làm tham số trong gọi lại. Sau đó, chúng tôi sử dụng mẫu được vẽ trong gọi lại và đặt làm màu tô của văn bản:

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

Gọi lại vẽ hình ảnh vào ngữ cảnh. Hình ảnh được thay đổi kích cỡ theo kích thước khung hình được chuyển vào cuộc gọi lại.

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

Tôi vừa hoàn thành một tiện ích mở rộng lớp UIColor làm cho điều này trở thành khối 1 dòng.

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

Thật tuyệt @bigkm. Điều này chắc chắn cho biết thêm một cách dễ dàng để sử dụng wrapper xung quanh một số mã lộn xộn. – windson

Các vấn đề liên quan