Ответ 1
Из того, что я понял, вам нужен слой, который рисует градиент, а CGContextDrawRadialGradient
отлично работает для этой потребности. И чтобы повторить то, что вы сказали, CAGradientLayer
не поддерживает радиальные градиенты, и мы ничего не можем с этим поделать, кроме ненужных swizzling, которые можно выполнить с помощью подкласса CALayer
.
(примечание: код чертежа градиента был взято отсюда. Это не тот ответ, о котором идет речь.)
viewDidLoad
:
GradientLayer *gradientLayer = [GradientLayer new];
gradientLayer.frame = self.view.bounds;
[self.view.layer addSublayer:gradientLayer];
Подкласс
CALayer
:
- (instancetype)init
{
self = [super init];
if (self) {
[self setNeedsDisplay];
}
return self;
}
- (void)drawInContext:(CGContextRef)ctx
{
size_t gradLocationsNum = 2;
CGFloat gradLocations[2] = {0.0f, 1.0f};
CGFloat gradColors[8] = {0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.5f};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, gradColors, gradLocations, gradLocationsNum);
CGColorSpaceRelease(colorSpace);
CGPoint gradCenter= CGPointMake(CGRectGetMidX(self.bounds), CGRectGetMidY(self.bounds));
float gradRadius = MIN(self.bounds.size.width , self.bounds.size.height) ;
CGContextDrawRadialGradient (ctx, gradient, gradCenter, 0, gradCenter, gradRadius, kCGGradientDrawsAfterEndLocation);
CGGradientRelease(gradient);
}