2013-11-14 6 views
3

I m Разработка приложения iphone, и я хочу создать круг с несколькими цветами. Как скринеСоздать круг с несколькими цветами

enter image description here

м с помощью рисовать прямоугольника метод для рисования круга, но не повезло с multiplecolors.

Вы можете помочь мне?

Заранее спасибо.

+0

Может помочь вам http://stackoverflow.com/questions/17269586/drawing-a-circle-filled-different-parts-with-different-color – iPatel

+0

@iPatel Я могу рисовать с помощью как piechart, но я хочу рисовать как на изображении не тактично. Спасибо за помощь. – Maul

+0

Нужно ли вам это масштабировать? Можете ли вы просто использовать 'UIImageView' с png-файлом? – godel9

ответ

5

Вы можете достичь этого эффекта, используя CAGradientLayer с круговой маской. Пример кода (предполагая, что вы используете его в каком-то виде контроллере):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    CAGradientLayer *glayer = [CAGradientLayer layer]; 
    glayer.frame = CGRectMake(60.0f, 60.0f, 200.0f, 200.0f); 
    glayer.colors = @[(__bridge id)[UIColor greenColor].CGColor, 
         (__bridge id)[UIColor cyanColor].CGColor, 
         (__bridge id)[UIColor blueColor].CGColor, 
         (__bridge id)[UIColor purpleColor].CGColor, 
         (__bridge id)[UIColor redColor].CGColor, 
         (__bridge id)[UIColor orangeColor].CGColor, 
         (__bridge id)[UIColor yellowColor].CGColor]; 
    glayer.backgroundColor = [UIColor redColor].CGColor; 
    CAShapeLayer *shLayer = [CAShapeLayer layer]; 
    [shLayer setPath:CGPathCreateWithEllipseInRect(CGRectMake(0, 0, 200, 200), NULL)]; 
    [glayer setMask:shLayer]; 
    [self.view.layer addSublayer: glayer]; 
} 

Обратите внимание, что colors и locations свойства CAGradientLayer является анимируемым, так что вы можете легко добавить анимированные эффекты, используя этот подход

+0

+1 Использование градиентов - лучший способ сделать это! – satheeshwaran

+0

Я постараюсь, и если это будет сделано, я обязательно приму ваш ответ. Спасибо – Maul

+0

@Vladimir Ваше решение работает, как шарм. не могли бы вы помочь мне в еще одном? Я хочу медленно менять этот цвет. Заранее спасибо – Maul

2

Вы можете попробовать использовать CGGradientRef и CGContextDrawLinearGradient из QuartzCore (не забыл добавить QuartzCore в свой проект и импортировать его)

создания градиента Вы можете использовать что-то вроде этого что-то подобное (в UIView подкласс):

- (void)drawRect:(CGRect)rect 
{ 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 

     CGGradientRef gradient; 
     CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();; 

     //5 is for count of colors 
     CGFloat parts[5] = { .2, .4, .6, .8, .1 }; 

     //colors for each part, so 5 parts by 4 each (r,g,b,a for each part in range 0 - 1, 1 is for 255 in regular rgb space, and alpha as usual) 
     CGFloat components[20] = { 
      .3, .24, .1, 1, 
      .3, .2, .7, 1, 
      .3, .84, .2, 1, 
      .3, .24, .3, 1, 
      .1, .5, .38, 1 
     }; 

     gradient = CGGradientCreateWithColorComponents(rgb, components, parts, 5); 

     CGPoint top = CGPointMake(CGRectGetMidX(rect), 0.0f); 
     CGPoint bottom = CGPointMake(CGRectGetMidX(rect), rect.size.height); 

     CGContextDrawLinearGradient(ctx, gradient, top, bottom, 0); 

     CGGradientRelease(gradient); 
     CGColorSpaceRelease(rgb); 

     //round shape you can archive by Vladimir's solution 
     CAShapeLayer *shLayer = [CAShapeLayer layer]; 
     [shLayer setPath:CGPathCreateWithEllipseInRect(CGRectInset(rect, 5, 5), NULL)]; 
     [self.layer setMask:shLayer]; 
} 
+0

Если вы решите нарисовать, используя CGContext, вы можете обрезать его с помощью функции CGContextClip, не используя слои для что. Однако, используя CGContext, вы не сможете легко применять анимацию для градиента – Vladimir

+0

я попробую спасибо – Maul

Смежные вопросы