是否可以在单个 CALayer 上使用自定义绘图绘制多个 UIView,这样它们就没有后备存储?
更新:
我有几个相同大小的 uiviews 具有相同的超级视图。现在他们每个人都有自定义绘图。由于尺寸很大,他们在 iPad 3 上创建了 600-800 mb 的后备存储。所以我想在一个视图上编写它们的输出,并且消耗的内存要少几倍。
是否可以在单个 CALayer 上使用自定义绘图绘制多个 UIView,这样它们就没有后备存储?
更新:
我有几个相同大小的 uiviews 具有相同的超级视图。现在他们每个人都有自定义绘图。由于尺寸很大,他们在 iPad 3 上创建了 600-800 mb 的后备存储。所以我想在一个视图上编写它们的输出,并且消耗的内存要少几倍。
每个视图都有自己的图层,您无法更改它。
您可以启用shouldRasterize
展平视图层次结构,这在某些情况下可能会有所帮助,但这需要 gpu 内存。
另一种方法是创建图像上下文并将绘图合并到图像中并将其设置为图层内容。
在去年的一个 wwdc 会议视频中,一个关于绘图的视频展示了一个绘图应用程序,其中许多笔画被转移到图像中以加快绘图速度。
由于视图将共享相同的后备存储,我假设您希望它们共享由图层的自定义绘图产生的相同图像,对吗?我相信这可以通过类似的方法来完成:
// 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];