3

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

- (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];

}

我得到如下第一张图片

在此处输入图像描述 在此处输入图像描述

sublayer, sublayer1 的位置不正确,因为我已经为它们设置了框架。它们的交集是混合色。为什么他们不设置实际位置?

但是当我使用时addSublayer,我得到了第二张图片。这里 sublayer, sublayer1 的位置是正确的。它们的交集不是混合颜色。发生了那样的事。

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

提前致谢。

4

1 回答 1

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);
}

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

您可以使用这种方法来拖动图层,如下所示:

  • 使用上述混合模式和绘图命令在新图层上为每个移动图层绘制一个矩形或在其顶部查看
  • 将移动层的当前帧用于绘图矩形
  • 确保新的顶层没有收到触摸
  • 每当交互层的位置改变时重绘新层
于 2012-07-09T19:03:52.770 回答