Как добавить прозрачную градиентную маску в контекст - PullRequest
3 голосов
/ 23 ноября 2011

Я использую кварц 2d, чтобы нарисовать круговую диаграмму.

Я использую слой, чтобы нарисовать отражение круговой диаграммы внизу.

Я хотел бы добавить прозрачный альфа-градиент к отражению, чтобы сделать его все более и более прозрачным, пока оно не станет невидимым.

У кого-то есть идея?

@ РЕДАКТИРОВАТЬ: подробнее Моя круговая диаграмма находится в CGLayerRef.

Сначала я рисую этот слой в CGContextRef. Тогда я делаю

CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

Быть с ног на голову.

Тогда я рисую свой слой в новое время

Заранее спасибо,

Лоик

1 Ответ

14 голосов
/ 23 ноября 2011

Вам необходимо использовать маску изображения.Вы можете сделать маску, нарисовав градиент в контексте растрового изображения:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef gc = CGBitmapContextCreate(NULL, rect.size.width, rect.size.height, 8, rect.size.width, colorSpace, kCGImageAlphaNone);
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)[NSArray arrayWithObjects:(__bridge id)[UIColor whiteColor].CGColor, (__bridge id)[UIColor blackColor].CGColor, nil], NULL);
CGColorSpaceRelease(colorSpace);
CGContextDrawLinearGradient(gc, gradient, CGPointMake(0, 0), CGPointMake(0, rect.size.height), 0);
CGGradientRelease(gradient);
CGImageRef mask = CGBitmapContextCreateImage(gc);
CGContextRelease(gc);

(Удалить __bridge, если вы не используете ARC.)

Тогда вы можете использовать маску дорисование изображения:

CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextClipToMask(context, rect, mask);

Не забудьте снять маску после того, как вы закончите.

...