将Calayer渲染到图像上下文是返回黑色



我的uiview子类广泛使用子层来构建复杂的图像。在屏幕上和iPad上最多有30个视图2沿周边路径的动画(这是外围层的路径属性)正在受苦。

最初,我只是在视图层上添加成组成层。

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

由于这也给了我黑色的矩形,所以我得出的结论是在屏幕上获得黑色矩形的方法都可以正常工作;-)但是我以某种方式弄乱了顶层以将顶层渲染到bitmap Graphics上下文中。p>我尝试摆弄开始新上下文的选项部分,是的,1.0对0.0;一切都无济于事。

我在以下过程中缺少什么:

  • 开始新的图形上下文
  • 将我的图层纳入该上下文
  • 从该上下文中获取图像

谢谢!

好吧,我找到了我没有做的事情:我的层从未绘制过它的内容,因此我需要在尝试从中获取图像之前将SetneedSdisplay发送到该层(似乎有点一点一点)对我来说,用诸如drawlayer:incontext:和renderincontext :)

之类的方法名称奇怪
[tmpLayer setNeedsDisplay];
UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[tmpLayer renderInContext:ctx];
renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.layer setContents:renderedImageOfMyself.CGImage];

做得好,但有时在iOS 6上对奇怪的指针不起作用。

我希望将来对某人有所帮助:)(我在todd yandell的Stackoverflow Powever上找到的代码的一部分)

UIGraphicsBeginImageContextWithOptions([tmpLayer frame].size, YES, 0.0);
[tmpLayer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

最新更新