当我按照以下方式编写代码时..
- (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];
}
我得到了第一张图片
子层,子层1的位置不正确,因为我已经为它们设置了帧。它们的交叉点是混色。他们为什么没有设定实际位置?
但是当我使用addSublayer
时,我得到了第二张图像。这里子层,子层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);
}
编辑(因为问题已被编辑):
您可以使用此方法拖动图层: