在一个图层上绘制几个UIViews

时间:2012-10-18 21:53:19

标签: objective-c ios uiview core-graphics

是否可以在单个CALayer上绘制带有自定义绘图的多个UIViews,以便它们各自没有后备存储?

更新:

我有几个相同大小的uiviews具有相同的superview。现在每个人都有自定义绘图。而且由于尺寸较大,他们在iPad 3上创建了600-800 MB的后备存储。所以我想在一个视图上组合他们的输出,并且消耗的内存要少几倍。

2 个答案:

答案 0 :(得分:3)

每个视图都有自己的图层,你无法改变它。

您可以启用shouldRasterize来展平视图层次结构,这在某些情况下可能有所帮助,但这需要gpu内存。

另一种方法是创建图像上下文并将图形合并到图像中并将其设置为图层内容。

在去年的一个关于绘图的wwdc会话视频中展示了一个绘图应用程序,其中许多笔划被转移到图像中以加速绘图。

答案 1 :(得分:1)

由于视图将共享相同的后备存储,我假设您希望它们共享由图层自定义绘图产生的相同图像,对吧?我相信这可以用类似的东西来完成:

// create your custom layer
MyCustomLayer* layer = [[MyCustomLayer alloc] init];

// create the custom views
UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake( 0, 0, layer.frame.size.width, layer.frame.size.height)];
UIView* view2 = [[UIView alloc] initWithFrame:CGRectMake( 100, 100, layer.frame.size.width, layer.frame.size.height)];

// have the layer render itself into an image context
UIGraphicsBeginImageContext( layer.frame.size );
CGContextRef context = UIGraphicsGetCurrentContext();
[layer drawInContext:context];
UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// set the backing stores (a.k.a the 'contents' property) of the view layers to the resulting image
view1.layer.contents = (id)image.CGImage;
view2.layer.contents = (id)image.CGImage;

// assuming we're in a view controller, all those views to the hierarchy
[self.view addSubview:view1];
[self.view addSubview:view2];