我的 UIView 子类广泛使用子层来构建复杂的图像。屏幕上有多达 30 个这样的视图,在 iPad 2 上,沿 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]];
因为这也给了我黑色矩形,所以我得出结论,在屏幕上获取黑色矩形的任何一种方法都可以正常工作;-) 但我不知何故搞砸了让顶层渲染到位图图形上下文中。
我试过摆弄开始新上下文的选项部分,YES vs NO,1.0 vs 0.0;一切都无济于事。
我在以下过程中缺少什么:
- 开始一个新的图形上下文
- 将我的图层绘制到该上下文中
- 从该上下文中获取图像
?
谢谢!