【问题标题】:CALayer drawInContext vs addSublayerCALayer drawInContext vs addSublayer
【发布时间】:2009-08-01 03:09:57
【问题描述】:

如何在同一个 UIView 中正确使用这两者?

我有一个自定义的子类 CALayer,我在其中绘制了 drawInContext 中的图案

我有另一个,我在其中设置了一个覆盖 PNG 图像作为内容。

我有第三个只是背景。

如何叠加所有这 3 个项目?

[self.layer addSublayer:bottomLayer];    // this line is the problem

[squaresLayer drawInContext:viewContext];
[self.layer addSublayer:imgLayer];

如果我按照这个顺序,另外两个自己会正确绘制。无论我尝试将bottomLayer放在哪里,它总是会阻止squaresLayer绘制。我需要 3 层的原因是我打算为背景和自定义层中的颜色设置动画。顶层只是一个图形叠加层。

【问题讨论】:

  • 几个问题:你确定没有绘制图层吗?或者它是否被绘制但没有给你你正在寻找的结果?图层如何重叠?这些层是否必须都在同一个视图中,或者您可以将其中一个拆分到不同的视图中?
  • 嗨,好吧,他们应该能够在同一个 UIView 中,我想我可以使用子视图,使用单独的视图来合成图层似乎有点多。但是,我确实提出了一个解决方案,方法是制作 2 个自定义图层。通过“addSublayer”添加到 self.layer 的任何内容似乎都绘制在通过“drawInContext”绘制的任何内容之上,后者直接绘制到视图的 .layer 的上下文中。好的,弄清楚我只是在该上下文中渲染了 2 层,并在顶部添加了 imgLayer。工作正常,至于动画使用 NSTimer 刷新视图,它运行 drawInContext。

标签: iphone objective-c uiview calayer cgcontext


【解决方案1】:

最好粘贴代码,以防有人尝试为具有自己内部绘制例程的堆叠 CALayer 设置动画

- (void)drawRect:(CGRect)rect {

    [imgLayer removeFromSuperlayer];

    CGFloat w = [self.blockViewDelegate w];
    CGFloat h = [self.blockViewDelegate h];

    CGFloat wb = w/4;
    CGFloat hb = h/4;

    CGContextRef viewContext = UIGraphicsGetCurrentContext();

    // Layers

    [bottomLayer sizes:wb :hb :1];
    bottomLayer.frame = CGRectMake(0, 0, w, h);
    bottomLayer.opaque = NO;

    [topLayer sizes:wb :hb :0];
    topLayer.frame = CGRectMake(0, 0, w, h);
    topLayer.opaque = NO;

    // Overlay

    imgLayer.frame = CGRectMake(0, 0, w, h);
    imgLayer.opaque = NO;
    imgLayer.opacity = 1.0f;

    UIImage *overlay = [self.blockViewDelegate image];
    CGImageRef img = overlay.CGImage;
    imgLayer.contents = (id)img;

    // Add layers

    [bottomLayer drawInContext:viewContext];
    [topLayer drawInContext:viewContext];
    [self.layer addSublayer:imgLayer];

}

blockViewDelegate 是我存储宽度、高度和图像信息的地方,它是这个 UIView 的控制器。

topLayer 和 bottomLayer 是自定义 UIView 子类,它们在视图中绘制一些具有可变颜色信息的形状。稍后在我的动画中,我只是用计时器重复运行“setNeedsDisplay”,这个例程重复,层使用更新的参数重新绘制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多