Вам не нужно нарисовать его по пикселям. Вы можете использовать радиальные градиенты:
CGPoint points[count];
/* set the points */
CGContextSaveGState(context);
CGContextBeginTransparencyLayer(context, NULL);
CGContextSetAlpha(context, 0.5);
CGContextSetBlendMode(context, kCGBlendModeXOR);
CGContextClipToRect(context, myFrame);
CGFloat radius = myFrame.size.height+myFrame.size.width;
CGColorSpaceRef colorSpace;
CFArrayRef colors;
const CGFloat * locations;
/* create the colors for the gradient */
for(NSUInteger i = 0;i<count;i++){
CGGradientRef gradient = CGGradientCreateWithColors(CGColorSpaceCreateDeviceGray(), colors, locations);
CGContextDrawRadialGradient(context, gradient, points[i], 0.0, points[i], radius, 0);
}
CGContextSetAlpha(context, 1.0);
CGContextEndTransparencyLayer(context);
CGContextRestoreGState(context);
Большая часть кода ясно, но вот некоторые моменты:
kCGBlendMode
в основном добавляет значение назад- и передний план, если оба имеют один и тот же альфа и альфа не 1,0. Вы также можете использовать kCGBlendModeColorBurn
без необходимости играть с прозрачностью. Проверьте ссылку.
radius
достаточно большой, чтобы покрыть всю рамку. Вы можете установить другое значение.
- Обратите внимание, что значения
locations
должны быть между 0.0 и 1.0. Вам необходимо выполнить калибровку ваших значений цвета в зависимости от radius
.