如何同时绘制多个CGLayers?

时间:2014-10-16 01:45:06

标签: ios iphone quartz-graphics cgcontext cglayer

我想在同一个for循环中向两个单独的CGLayer绘制对象,但我不确定如何执行此操作。

例如,我想绘制三个橙色圆圈三个蓝色圆圈后面,橙色圆圈在一个图层中,蓝色圆圈在另一个图层中。以下代码将每个圆圈放在上一个圆圈的顶部:

-(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的三个蓝色圆圈后面的for?我想这与保存和恢复上下文有关,但我无法真正地围绕它。

非常感谢!

PS:我意识到我可以简单地使用两个{{1}}循环内联来实现正确的效果,但这个例子是出于教学目的而学习分层的。谢谢!

2 个答案:

答案 0 :(得分: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;
}

如果您仍然遇到问题或需要帮助,请给我反馈。

答案 1 :(得分:0)

为此目的,您需要部分绘制蓝色或橙色圆圈(取决于您想要位于顶部的那个)。您可能理解只有两种可能的选择:a)橙色层位于顶部2)蓝色层位于顶部2。我想,如果你想按颜色对圆圈进行分组(每个圆圈不使用1层),你最好: 1)使用1层进行绘图 2)在某处存储Bezier路径(代表圆圈) 3)按照顺序绘制路径并覆盖你需要的路径。