2013-09-12 2 views
0

Я рисую 4 дуги, используя CGContextRef.I могу заполнить цвет, но теперь я хочу установить цвет градиента в эту дугу. Я сделал it.it работает отлично. Теперь я хочу установить разные цвета для каждой дуги .а есть ли способ сделать это, пожалуйста, помогите меня.Я прилагаю мой код и скриншот этого arc.Code:Gradient Color To CGContextRef

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 

CGFloat comps[] = {1.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0}; 
CGFloat locs[] = {0,1}; 
CGGradientRef g = CGGradientCreateWithColorComponents(space, comps, locs, 2); 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGFloat startAngle = 0; 
CGFloat endAngle = 90; 
CGFloat radius = 100.0; 
CGFloat levelWidth = 50; 
for (int i = 0; i < 4; i++) { 
    CGContextMoveToPoint(context, self.bounds.size.width/2, self.bounds.size.height/2); 
    CGContextAddArc(context, self.bounds.size.width/2, self.bounds.size.height/2, radius, DEGREES_RADIANS(startAngle), DEGREES_RADIANS(endAngle), NO); 
    CGContextAddArc(context, self.bounds.size.width/2, self.bounds.size.height/2, radius - levelWidth, DEGREES_RADIANS(endAngle),DEGREES_RADIANS(startAngle), YES); 
    startAngle = endAngle; 
    endAngle = endAngle + 90; 
    CGContextClosePath(context); 

} 


//CGContextClosePath(context); 
CGContextClip(context); 
CGContextDrawRadialGradient(context, g, CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2), 1.0f, CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2), 150, 0); 

и экран выстрел: enter image description here

+0

градиент цвет должен быть на внешнем (больший) радиусе до половины ширины слоя ... – h999

+0

BTW, не забудьте '' CGGradientRelease' вашего CGGradientRef'. – Rob

ответ

0

Вы хотите сохранить контекст с CGContextSaveGState перед тем, как вы клиппируете, обрезаете и нарисуете дугу, а затем восстановите контекст с помощью CGContextRestoreGState, прежде чем рисовать следующую дугу. И вам явно нужен массив CGGradientRef. Таким образом:

CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB(); 

CGGradientRef g[4]; 

CGFloat comps0[] = {1.0,1.0,1.0,1.0,0.0,1.0,1.0,1.0}; 
CGFloat locs[] = {0,1}; 
g[0] = CGGradientCreateWithColorComponents(space, comps0, locs, 2); 

CGFloat comps1[] = {1.0,1.0,1.0,1.0,1.0,0.0,1.0,1.0}; 
g[1] = CGGradientCreateWithColorComponents(space, comps1, locs, 2); 

CGFloat comps2[] = {1.0,1.0,1.0,1.0,1.0,1.0,0.0,1.0}; 
g[2] = CGGradientCreateWithColorComponents(space, comps2, locs, 2); 

CGFloat comps3[] = {1.0,1.0,1.0,1.0,0.5,0.0,0.5,1.0}; 
g[3] = CGGradientCreateWithColorComponents(space, comps3, locs, 2); 

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGFloat startAngle = 0; 
CGFloat endAngle = 90; 
CGFloat radius = 100.0; 
CGFloat levelWidth = 50; 
for (int i = 0; i < 4; i++) { 
    CGContextSaveGState(context); 
    CGContextMoveToPoint(context, self.bounds.size.width/2, self.bounds.size.height/2); 
    CGContextAddArc(context, self.bounds.size.width/2, self.bounds.size.height/2, radius, DEGREES_RADIANS(startAngle), DEGREES_RADIANS(endAngle), NO); 
    CGContextAddArc(context, self.bounds.size.width/2, self.bounds.size.height/2, radius - levelWidth, DEGREES_RADIANS(endAngle),DEGREES_RADIANS(startAngle), YES); 
    startAngle = endAngle; 
    endAngle = endAngle + 90; 
    CGContextClosePath(context); 
    CGContextClip(context); 
    CGContextDrawRadialGradient(context, g[i], CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2), 1.0f, CGPointMake(self.bounds.size.width/2, self.bounds.size.height/2), 150, 0); 
    CGContextRestoreGState(context); 
    CGGradientRelease(g[i]);   // don't forget to release the gradient 
} 

radial quadrants

+0

superb ... Мне нравится, как вы думаете ... – h999

+0

@rob Что такое DEGREES_RADIANS? – karthikeyan

+0

@ karthikeyan - Извините, что вы сбиваете с толку. Это простой макрос для преобразования градусов в радианы. 360 градусов = M_PI * 2.0. Таким образом: '#define DEGREES_RADIANS (градусы) (градусы * M_PI/180.0)' – Rob