我正在开发一款iPhone应用程序,希望创建一个带有多种颜色的圆形。如下图所示:
我正在使用绘制矩形法绘制圆形,但是无法实现多种颜色。
请问您能帮我吗?
提前感谢您。
![enter image description here](https://istack.dev59.com/AM9E8.webp)
请问您能帮我吗?
提前感谢您。
- (void)viewDidLoad
{
[super viewDidLoad];
CAGradientLayer *glayer = [CAGradientLayer layer];
glayer.frame = CGRectMake(60.0f, 60.0f, 200.0f, 200.0f);
glayer.colors = @[(__bridge id)[UIColor greenColor].CGColor,
(__bridge id)[UIColor cyanColor].CGColor,
(__bridge id)[UIColor blueColor].CGColor,
(__bridge id)[UIColor purpleColor].CGColor,
(__bridge id)[UIColor redColor].CGColor,
(__bridge id)[UIColor orangeColor].CGColor,
(__bridge id)[UIColor yellowColor].CGColor];
glayer.backgroundColor = [UIColor redColor].CGColor;
CAShapeLayer *shLayer = [CAShapeLayer layer];
[shLayer setPath:CGPathCreateWithEllipseInRect(CGRectMake(0, 0, 200, 200), NULL)];
[glayer setMask:shLayer];
[self.view.layer addSublayer: glayer];
}
colors
和locations
属性是可动画化的,因此您可以轻松地使用这种方法添加动画效果。您可以尝试使用来自QuartzCore的CGGradientRef和CGContextDrawLinearGradient(不要忘记在项目中添加QuartzCore并导入它)。
创建渐变可以像这样使用(在UIView子类中):
- (void)drawRect:(CGRect)rect
{
CGContextRef ctx = UIGraphicsGetCurrentContext();
CGGradientRef gradient;
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();;
//5 is for count of colors
CGFloat parts[5] = { .2, .4, .6, .8, .1 };
//colors for each part, so 5 parts by 4 each (r,g,b,a for each part in range 0 - 1, 1 is for 255 in regular rgb space, and alpha as usual)
CGFloat components[20] = {
.3, .24, .1, 1,
.3, .2, .7, 1,
.3, .84, .2, 1,
.3, .24, .3, 1,
.1, .5, .38, 1
};
gradient = CGGradientCreateWithColorComponents(rgb, components, parts, 5);
CGPoint top = CGPointMake(CGRectGetMidX(rect), 0.0f);
CGPoint bottom = CGPointMake(CGRectGetMidX(rect), rect.size.height);
CGContextDrawLinearGradient(ctx, gradient, top, bottom, 0);
CGGradientRelease(gradient);
CGColorSpaceRelease(rgb);
//round shape you can archive by Vladimir's solution
CAShapeLayer *shLayer = [CAShapeLayer layer];
[shLayer setPath:CGPathCreateWithEllipseInRect(CGRectInset(rect, 5, 5), NULL)];
[self.layer setMask:shLayer];
}