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);
}
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