gpt4 book ai didi

ios - 将 CALayer 渲染到图像上下文会返回黑色

转载 作者:可可西里 更新时间:2023-11-01 04:21:33 26 4
gpt4 key购买 nike

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

最初,我只是将组成层作为子层添加到我的 View 层上。

[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:)

[tmpLayer setNeedsDisplay];
UIGraphicsBeginImageContextWithOptions([self bounds].size, YES, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
[tmpLayer renderInContext:ctx];
renderedImageOfMyself = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[self.layer setContents:renderedImageOfMyself.CGImage];

关于ios - 将 CALayer 渲染到图像上下文会返回黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13325597/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com