是否可以在iPhone SDK中从CGLayer设置CALayer的内容?

时间:2010-02-09 20:42:23

标签: iphone objective-c core-graphics

对于我实现的自定义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的方法吗?

1 个答案:

答案 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上下文。