Ios 将CALayer渲染到图像上下文将返回黑色

Ios 将CALayer渲染到图像上下文将返回黑色,ios,calayer,Ios,Calayer,我的UIView子类广泛使用子层来构建复杂图像。屏幕上最多有30个这样的视图,在iPad2上,perimeterPath(perimeterLayer的路径属性)上的动画性能受到了影响 最初,我只是将组成层添加为视图层上的子层 [self.layer addSublayer:self.leftsideLayer]; // CAShapeLayer [self.layer addSublayer:self.rightsideLayer]; // CAShapeLayer [self.layer

我的UIView子类广泛使用子层来构建复杂图像。屏幕上最多有30个这样的视图,在iPad2上,perimeterPath(perimeterLayer的路径属性)上的动画性能受到了影响

最初,我只是将组成层添加为视图层上的子层

[self.layer addSublayer:self.leftsideLayer];  // CAShapeLayer
[self.layer addSublayer:self.rightsideLayer]; // CAShapeLayer
[self.layer addSublayer:self.perimeterLayer]; // CAShapelayer
[self.layer addSublayer:self.valueLayer];     // CAShapeLayer
[self.layer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask)
屏幕上的渲染非常完美。但是由于动画开始滞后,我准备了这段代码来构建一个临时层,目的是将临时层渲染成位图。第一步是确保我可以稍微修改现有代码:

CALayer *tmpLayer = [CALayer layer];
[tmpLayer addSublayer:self.leftsideLayer];  // CAShapeLayer
[tmpLayer addSublayer:self.rightsideLayer]; // CAShapeLayer
[tmpLayer addSublayer:self.perimeterLayer]; // CAShapelayer
[tmpLayer addSublayer:self.valueLayer];     // CAShapeLayer
[tmpLayer insertSublayer:self.gradientLayer atIndex:0]; // CAGradientLayer + CAShapeLayer (as mask)
[self.layer addSublayer:tmpLayer];
正如所料,这很好

然后,下一步是生成所有这些层的预渲染版本:

//  [self.layer addSublayer:tmpLayer];
    UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0);
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    [self drawLayer:tmpLayer inContext:ctx];
    UIImage *renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext();
    if (!renderedImageOfMyself) {
        NSLog(@"Well that didn't work");
    }
    UIGraphicsEndImageContext();
    [self.layer setContents:renderedImageOfMyself.CGImage];
结果是屏幕上出现黑色矩形,所以接下来我尝试:

// [self.layer setContents:renderedImageOfMyself.CGImage];
[self addSubview:[[UIImageView alloc] initWithImage:renderedImageOfMyself]];
由于这也给了我黑色矩形,我得出结论,在屏幕上获得黑色矩形的任何一种方法都很好;-)但是我把顶层渲染到位图图形上下文中搞砸了

我尝试过在开始新环境的时候摆弄选项部分,是与否,1.0与0.0;都没有用

我在以下过程中遗漏了什么:

  • 开始一个新的图形上下文
  • 将我的图层绘制到该上下文中
  • 从该上下文中获取图像
?


谢谢

我发现了我没有做的事情:我的图层从来没有绘制过它的内容,所以我需要先将setNeedsDisplay发送到图层,然后再尝试从图层中获取图像(对于像drawLayer:inContext:和renderInContext:这样的方法名,我觉得有点奇怪)


干得不错,但有时在iOS 6上对奇怪的指针不起作用

我希望这对将来的人有所帮助:)(我在Todd Yandell的stackoverflow Power上找到的部分代码)


我用同样的代码尝试了,我得到了一个黑色的图像。如果我做错了什么,你能看看我的代码吗?
[tmpLayer setNeedsDisplay];
UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[tmpLayer renderInContext:ctx];
renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.layer setContents:renderedImageOfMyself.CGImage];
UIGraphicsBeginImageContextWithOptions([tmpLayer frame].size, YES, 0.0);
[tmpLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();