Заполнение контура градиентом на iOS

На CAShapeLayer я нарисовал закрытый UIBezierPath. Я могу заполнить эту форму, установив fillColor, однако я хочу заполнить форму градиентом. Как я могу настроить CAGradientLayer так, чтобы он обрезал форму, очерченную путем Безье?


person Thorsten    schedule 06.04.2012    source источник


Ответы (2)


То, что вы хотите, это маска. CAGradientlayer имеет метод -setMask, который может обрезать его по границам вашей фигуры следующим образом:

[gradientLayer setMask:shapeLayer];

person CodaFi    schedule 06.04.2012

Примерный пример будет следующим:

...
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);

...
person WhiteTiger    schedule 06.04.2012
comment
Это хорошо, но вы также должны освободить градиент и цветовое пространство. - person Sulthan; 17.03.2013
comment
поскольку в исходном посте была маска, я также добавил следующее: CGContextAddPath(context, roundedRectanglePath.CGPath); CGContextClip(context); перед CGContextDrawLinearGradient - person maggix; 04.07.2013