Хорошо, я понял это. По сути, мы можем переопределить 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);
}