2014-10-16 5 views
3

Я хотел бы нарисовать объекты для двух отдельных CGLayers из той же петли for, но я не уверен, как это сделать.Как нарисовать для нескольких CGLayers одновременно?

Например, я хотел бы нарисовать три оранжевых круга позади три синих круга, с оранжевыми кругами в одном слое и синие круги в другом. Следующий код будет поместить каждый круг на вершине предыдущего круга:

-(void) drawRect:(CGRect)rect { 
    UIBezierPath *circle; 
    for (int i = 1; i <= 3; i++) { 
     // Create an orange circle 
     circle = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(CGRectMake(i*50, 80, 50, 50), 0, 0)]; 
     circle.lineWidth = 4.0f; 
     [[UIColor colorWithRed:1.0 green:0.75 blue:0 alpha:1.0] setFill]; 
     [[UIColor orangeColor] setStroke]; 
     [circle stroke]; 
     [circle fill]; 

     // Create a blue circle 
     circle = [UIBezierPath bezierPathWithOvalInRect:CGRectInset(CGRectMake(25 + i*50, 80, 50, 50), 0, 0)]; 
     circle.lineWidth = 4.0f; 
     [[UIColor colorWithRed:0 green:0.5 blue:1.0 alpha:1.0] setFill]; 
     [[UIColor blueColor] setStroke]; 
     [circle stroke]; 
     [circle fill]; 
    } 
} 

Output from the code above

Как бы я изменить это так, чтобы три оранжевые круги будут в конечном итоге в orangeLayer, который сидит за тремя синими кругами в blueLayer? Я полагаю, что это имеет какое-то отношение к сохранению и восстановлению контекстов, но я не могу оборачивать вокруг себя.

Большое спасибо!

PS: Я понимаю, что могу просто нарисовать, используя две линии for, чтобы добиться правильного эффекта, но этот пример предназначен для учебных целей, чтобы изучить слои. Благодаря!

ответ

0

Я строю пользовательский подкласс UIView и создать функцию makeCircleWithFrame, чтобы нарисовать круг внутри зрения, используя UIGraphicsBeginImageContextWithOptions, я считаю, что это будет решить главную проблему:

#import "circleView.h" 
#import <math.h> 

@implementation circleView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (!self) return self; 

    [self setupViews]; 

    return self; 
} 

- (void)awakeFromNib 
{ 
    [self setupViews]; 
} 

- (void)setupViews 
{ 
    [self setBackgroundColor:[UIColor whiteColor]]; 


    for (int i = 1; i <= 6; i++) { 

     UIColor *circleColor; 

     //Math function just to set different colors for each circle 
     if (fmodf(i, 2) == 0) { 
      circleColor = [UIColor colorWithRed:1.0 green:0.75 blue:0 alpha:1.0]; 
     } 
     else { 
      circleColor = [UIColor colorWithRed:0 green:0.5 blue:1.0 alpha:1.0]; 
     } 


     UIView *circleView = [self makeCircleWithFrame:(CGRectMake(10*i, 10*i, 100, 100)) andFillColor:circleColor]; 
     circleView.tag = i; 
     NSLog(@"circle %i", i); 
    } 
} 

- (UIView *)makeCircleWithFrame:(CGRect)rect andFillColor:(UIColor *)color { 
    // declare UIimageView, not UIView 
    UIImageView *customView = [[UIImageView alloc] init]; 
    customView.frame= self.bounds; 

    // create a new contex to draw 
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 200), NO, 0); 

    UIBezierPath *grayCircle = [UIBezierPath bezierPathWithOvalInRect:rect]; 

    grayCircle.lineWidth = 6; 
    [color setFill]; 
    [[UIColor orangeColor] setStroke]; 
    [grayCircle stroke]; 
    [grayCircle fill]; 

    customView.image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    [self addSubview:customView]; 

    return customView; 
} 

Пожалуйста, дайте мне обратную связь, если у вас все еще есть проблемы или вам больше нужна помощь.

+0

любой прогресс @bob? – carantes

0

Для этого вам необходимо либо нарисовать синий или оранжевый круги частично (в зависимости от того, какой из них вы хотите видеть сверху). Вероятно, вы понимаете, что есть только 2 возможных варианта: а) оранжевый слой сверху 2) синий. Я думаю, если вы хотите группировать круги по цвету (без использования 1 слоя на круг), вам лучше: 1) использовать 1 слой для рисования 2) хранить пути Безье (которые представляют круги) где-то 3) рисовать пути в соответствии с порядком и наложением вам нужно.