Я собираюсь сделать один треугольник, но вы можете сделать несколько используя повторение:
//Create the triangle Path and clip the drawing to it
CGContextSaveGState(context);
CGContextBeginPath(context);
CGContextMoveToPoint(context, self.bounds.size.width * .4, self.bounds.size.height * 1/6.);
CGContextAddLineToPoint(context,self.bounds.size.width * .4, self.bounds.size.height * 3/6.);
CGContextAddLineToPoint(context,self.bounds.size.width * .2, self.bounds.size.height * 3/6.);
CGContextClosePath(context);
CGContextClip(context);
//Now call the linear gradient drawing function
[self drawLinearGradient:context withRect:self.bounds startColor:[UIColor colorWithRed:1 green:1 blue:1 alpha:.3] endColor:[UIColor colorWithRed:.5 green:.5 blue:.5 alpha:.3] startFraction:.3 stopFraction:1];
//And now restore so that we can clip the next triangle
CGContextRestoreGState(context);
Теперь для линейного кода градиента рисования:
- (void) drawLinearGradient: (CGContextRef) context withRect: (CGRect) rect startColor: (UIColor*) startColor endColor: (UIColor*) endColor startFraction:(float)start stopFraction:(float)stop
{
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = { start, stop };
CGGradientRef myGradient;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
CGColorRef startColorRef = [startColor CGColor];
CGColorRef endColorRef = [endColor CGColor];
const CGFloat *components = CGColorGetComponents(startColorRef);
CGFloat red = components[0];
CGFloat green = components[1];
CGFloat blue = components[2];
CGFloat alpha = components[3];
const CGFloat *components2 = CGColorGetComponents(endColorRef);
CGFloat red2 = components2[0];
CGFloat green2 = components2[1];
CGFloat blue2 = components2[2];
CGFloat alpha2 = components2[3];
CGFloat colors[] =
{
red, green, blue, alpha,
red2, green2, blue2, alpha2
};
myGradient = CGGradientCreateWithColorComponents(rgb, colors, locations, 2);
CGColorSpaceRelease(rgb);
CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect));
CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect));
CGContextSaveGState(context);
CGContextAddRect(context, rect);
CGContextClip(context);
CGContextDrawLinearGradient(context, myGradient, startPoint, endPoint, 0);
CGContextRestoreGState(context);
CGGradientRelease(myGradient);
CGColorSpaceRelease(colorSpace);
}
Вы можете настроить эта функция линейного градиента обрабатывает более двух местоположений/цветов, если вы хотите. Это очень просто, но если вы знаете начало и конец цветов и местоположений каждого треугольника, вы должны выполнить то, что хотите (рисунок изначально) с помощью этого кода (без сотен подслоев). Хотя слои могут рисовать быстрее, я понятия не имею.
Я не знаю, почему вы получили downvoted пару раз, так что вот +1, чтобы сделать вас еще раз. – Michael
Спасибо, Майкл, оцените его;) – Andre