Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filling a path with a gradient on iOS

On a CAShapeLayer, I've drawn a closed UIBezierPath. I can fill this shape by setting the fillColor, however I want to fill the shape with a gradient. How can I set up the CAGradientLayerso it clips to the shape outlined by the bezier path?

like image 872
Thorsten Avatar asked Apr 06 '12 14:04

Thorsten


People also ask

How do you add gradient fill?

Click the shape, and when the Format tab appears, click Shape Fill. Click Gradient > More Gradients > Gradient fill. Pick a Type from the list. To set the direction for the gradient, click Direction.


1 Answers

A draft example would be the following:

...
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = UIGraphicsGetCurrentContext();

UIColor *gradientColor = [UIColor colorWithRed:0.51 green:0.0 blue:0.49 alpha:1.0];

NSArray *gradientColors = [NSArray arrayWithObjects: 
                          (id)[UIColor blueColor].CGColor, 
                          (id)gradientColor.CGColor, 
                          (id)[UIColor redColor].CGColor, nil];
CGFloat gradientLocations[] = {0, 0.5, 1};
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (CFArrayRef)gradientColors, gradientLocations);

UIBezierPath *roundedRectanglePath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(10, 10, 200, 200) cornerRadius:6];
CGContextSaveGState(context);
[roundedRectanglePath fill];
[roundedRectanglePath addClip];
CGContextDrawLinearGradient(context, gradient, CGPointMake(10, 10), CGPointMake(210, 10), 0);
CGColorSpaceRelease(colorSpace);
CGGradientRelease(gradient);

...
like image 110
WhiteTiger Avatar answered Oct 21 '22 09:10

WhiteTiger