对于我实现的自定义UIView,我想在多个CALayers中显示一些图形,这些图形被添加为我的UIViews图层的子视图。
我无法使用我的UIView作为子图层的委托。 UIView可能只是一个图层的委托,也就是UIView从一开始就拥有的图层。由于我也不想继承CALayer子类或创建专用委托,我认为对图像进行渲染并将其设置为子图层的内容是个好主意。
最初的实验表明,我可以通过这样的事情来完成整个工作:
-(void) initCustomLayer: {
UIGraphicsBeginImageContext(self.bounds.size);
CGContextRef ctx = UIGraphicsGetCurrentContext ();
// ... do the drawing in ctx ...
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
customLayer = [[CALayer alloc] init];
customLayer.bounds.size = self.bounds.size;
customLayer.contents = image.CGImage;
[self.layer addSublayer customLayer];
[customLayer release];
}
在文档中,它说使用CGLayer进行屏幕外渲染是进行屏幕外渲染的首选方式。所以我想在CGLayer中进行绘图。
我似乎无法找到是否有办法从CGLayer设置CALayer的内容?
这是否可行,甚至有意义?我应该停止担心并采用基于UIImage / CGImageRef的方法吗?
答案 0 :(得分:2)
虽然文档没有说CALayers与CGLayers的工作方式类似,但the Graphics and Imaging Overview表示Core Animation是“GPU加速的”,我认为我们可以安全地解释为它将CALayer内容放在视频上卡,只要它可以。那也是what CGLayer does。
所以,我希望CGImage支持的CALayer提供与CGLayer大致相同的性能优势,只要你不经常更换图像。
如果你想绝对确定你将获得与CGLayer相同的缓存作为纹理行为,请创建一个CALayer的子类,它具有一个属性来保存CGLayer,并通过绘制响应drawInContext:
CGLayer。
如果如果 CALayer将动态绘制的内容缓存在视频卡上(而且我不知道它是否存在),那么你将会有两次,浪费视频内存。对于你和我所知道的,上下文CALayer让你绘制的是一个CGLayer上下文。