如何在iOS中使用addSublayer和renderInContext

时间:2012-07-09 13:59:26

标签: iphone ios5 calayer render

当我按照以下方式编写代码时..

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetBlendMode(context, kCGBlendModeDifference);

    sublayer = [CALayer layer];
    sublayer.backgroundColor = [UIColor redColor].CGColor;
    sublayer.opaque = NO;
    sublayer.frame = CGRectMake(30, 30, 250, 200);
    [sublayer renderInContext:context];

    sublayer1 = [CALayer layer];
    sublayer1.opaque = NO;
    sublayer1.backgroundColor = [UIColor greenColor].CGColor;
    sublayer1.frame = CGRectMake(120, 120, 100, 250);
    [sublayer1 renderInContext:context];

}

我得到了第一张图片

enter image description here enter image description here

子层,子层1的位置不正确,因为我已经为它们设置了帧。它们的交叉点是混色。他们为什么没有设定实际位置?

但是当我使用addSublayer时,我得到了第二张图像。这里子层,子层1的位置是正确的方式。它们的交叉点不是混合色。发生了什么事。

为什么我创建了子图层,当我拖动子图层时,它们的交叉部分必须是混合颜色。请有人向我解释。

先谢谢。

1 个答案:

答案 0 :(得分:1)

这是您的代码中发生的情况:在第一种情况下,您只是在视图底层的图形上下文中绘制了图层。这就是drawRect所做的。框架的原点不会影响它,因为它只是将子图层放在其父图层中。但是在这里,图层永远不会添加到父图层,因此原点根本不做任何事情,两个图形都显示为0,0。

在第二种情况下,首先发生与之前完全相同的事情,但由于您还将图层添加到图层层次结构中,因此它们会再次在视图的基础图层上方的指定位置进行渲染。每个子图层都在其自己的上下文中呈现,因此您在drawRect中设置的混合模式对它们没有影响。

实际上,如果您只想获得两个矩形的图像,则根本不需要子图层。您可以直接在视图的底层中的drawRect中绘制它们:

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

    CGContextSetFillColorWithColor(ctx, [UIColor redColor].CGColor);
    CGRect rect1 = CGRectMake(30, 30, 250, 200);
    CGContextFillRect(ctx, rect1);

    CGContextSetFillColorWithColor(ctx, [UIColor greenColor].CGColor);
    CGRect rect2 = CGRectMake(120, 120, 100, 250);
    CGContextFillRect(ctx, rect2);
}

编辑(因为问题已被编辑):

您可以使用此方法拖动图层:

  • 使用上述混合模式和绘图命令,在新图层或顶部视图上为每个移动图层绘制一个矩形
  • 使用移动图层的当前帧作为图纸
  • 确保新的顶层没有接收到触摸
  • 每当交互层的位置发生变化时重绘新图层