Создание градиентной заливки для текста с помощью [UIColor colorWithPatternImage:] - PullRequest
7 голосов
/ 10 августа 2011

Я хочу создать градиент для цвета заливки моего текста. В настоящее время я делаю это, устанавливая цвет текста UILabel как

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

Где GradientFillImage.png - простой файл изображения с нарисованным линейным градиентом.

Это прекрасно работает, пока я не хочу изменить размер шрифта. Так как файл изображения имеет постоянные размеры и не меняет размер при изменении размера шрифта, градиентная заливка для шрифта будет испорчена. Как создать изображение шаблона нестандартного размера и применить его в качестве шаблона заполнения для текста?

Ответы [ 2 ]

4 голосов
/ 12 ноября 2012

Я только что закончил расширение класса 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]];
2 голосов
/ 12 августа 2011

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