【问题标题】:How will work addSublayer and renderInContext in iOSiOS 中的 addSublayer 和 renderInContext 将如何工作
【发布时间】:2012-07-09 13:59:25
【问题描述】:

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

- (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 的位置是正确的。它们的交集不是混合颜色。发生了那样的事。

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

提前致谢。

【问题讨论】:

    标签: iphone ios5 calayer render


    【解决方案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-03-20
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-10
    • 1970-01-01
    相关资源
    最近更新 更多