我需要一个椭圆形或椭圆形的径向渐变,看起来CGContextDrawRadialGradient只能绘制一个完美的圆形。我一直在绘制正方形上下文,然后复制/绘制成矩形上下文。
有更好的方法吗?
谢谢!
答案 0 :(得分:5)
我发现这样做的唯一方法是Mark F建议的,但我认为答案需要一个更容易理解的例子。
在iOS(并使用ARC)的视图中绘制椭圆渐变:
- (void)drawRect:(CGRect)rect {
CGContextRef ctx = UIGraphicsGetCurrentContext();
// Create gradient
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat locations[] = {0.0, 1.0};
UIColor *centerColor = [UIColor orangeColor];
UIColor *edgeColor = [UIColor purpleColor];
NSArray *colors = [NSArray arrayWithObjects:(__bridge id)centerColor.CGColor, (__bridge id)edgeColor.CGColor, nil];
CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations);
// Scaling transformation and keeping track of the inverse
CGAffineTransform scaleT = CGAffineTransformMakeScale(2, 1.0);
CGAffineTransform invScaleT = CGAffineTransformInvert(scaleT);
// Extract the Sx and Sy elements from the inverse matrix
// (See the Quartz documentation for the math behind the matrices)
CGPoint invS = CGPointMake(invScaleT.a, invScaleT.d);
// Transform center and radius of gradient with the inverse
CGPoint center = CGPointMake((self.bounds.size.width / 2) * invS.x, (self.bounds.size.height / 2) * invS.y);
CGFloat radius = (self.bounds.size.width / 2) * invS.x;
// Draw the gradient with the scale transform on the context
CGContextScaleCTM(ctx, scaleT.a, scaleT.d);
CGContextDrawRadialGradient(ctx, gradient, center, 0, center, radius, kCGGradientDrawsBeforeStartLocation);
// Reset the context
CGContextScaleCTM(ctx, invS.x, invS.y);
// Continue to draw whatever else ...
// Clean up the memory used by Quartz
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
}
放入一个黑色背景的视图:
答案 1 :(得分:4)
您可以更改上下文的变换以绘制椭圆(例如,在调用CGContextDrawRadialGradient()之前应用CGContextScaleCTM(上下文,2.0,1.0)以绘制宽度是其高度的两倍的椭圆渐变。但请记住将逆变换应用于起点和终点。