我正在使用 CGlayers 进行绘图。我已经实现了绘图部分,用户将绘制的drawingView(canvas)是动态的,我的意思是,用户可以增加/减少drawingView(Canvas)的高度
例如默认大小 - 500*200
当用户点击展开按钮时 - 500*300
所以这是我在用户展开画布时的功能,
- (void)IncreaseCanavasSize
{
CGContextRef layerContext1 = CGLayerGetContext(permanentDrawingLayer );
CGContextDrawLayerInRect(layerContext1, rectSize, newDrawingLayer);
rectSize = self.bounds;
CGFloat scale = self.contentScaleFactor;
CGRect bounds = CGRectMake(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale);
CGLayerRef layer = CGLayerCreateWithContext(layerContext1, bounds.size, NULL);
CGContextRef layerContext = CGLayerGetContext(layer);
CGContextScaleCTM(layerContext, scale, scale);
[self setNewDrawingLayer:layer];
CGLayerRelease(layer);
CGContextDrawLayerInRect(layerContext, self.bounds, permanentDrawingLayer);
permanentDrawingLayer = nil;
}
所以让我解释一下我在上面的代码中做了什么,我正在创建一个 newLayer,它的大小在增加之前,然后将 previousDrawing 从“* PermanentDrawingLayer ”转移到这个“ newDrawingLayer ”并使“permanentDrawing”为零*
所以每当我画画时,我都会画到permanentDrawingLayer,这是我的drawRect方法
- (void)drawRect:(CGRect)rect
{
if(permanentDrawingLayer == nil)
{
CGFloat scale = self.contentScaleFactor;
CGRect bounds = CGRectMake(0, 0, self.bounds.size.width * scale, self.bounds.size.height * scale);
CGLayerRef layer = CGLayerCreateWithContext(context, bounds.size, NULL);
CGContextRef layerContext = CGLayerGetContext(layer);
CGContextScaleCTM(layerContext, scale, scale);
[self setPermanentDrawingLayer:layer];
CGLayerRelease(layer);
}
CGContextRef layerContext = CGLayerGetContext(permanentDrawingLayer);
CGContextBeginPath(layerContext);
CGContextAddPath(layerContext, mutablePath);
CGContextSetLineWidth(layerContext, self.lineWidth);
CGContextSetLineCap(layerContext, kCGLineCapRound);
CGContextSetLineJoin(layerContext, kCGLineJoinRound);
CGContextSetAllowsAntialiasing(layerContext, YES);
CGContextSetShouldAntialias(layerContext, YES);
CGContextSetStrokeColorWithColor(layerContext, self.lineColor.CGColor);
CGContextSetFillColorWithColor(layerContext, self.lineColor.CGColor);
CGContextSetBlendMode(layerContext,kCGBlendModeNormal);
CGContextStrokePath(layerContext);
CGContextDrawLayerInRect(context,rectSize, newDrawingLayer);
CGContextDrawLayerInRect(context, self.bounds, permanentDrawingLayer);
}
在这里你可以看到,我用 rectSize 绘制 newDrawingLayer,用 newSize 绘制 permanetDrawingLayer,所以每当我在画布上绘制时,如果用户增加了尺寸,newDrawingLayer 就会绘制它,而无论用户做什么,新的绘制都将在 PermanentDrawingLayer 中完成。希望很清楚。
现在这是我的问题
1)当我drawSomething并增加canvasSize时,内存峰值达到10MB,所以如果我总是这样做,你可以想象,我的应用程序由于内存压力而终止的速度有多快。
2)我看到的是,如果我在函数-“ IncreaseCanavasSize ”中评论“ PermanentDrawingLayer = nil ”行,那么内存不会飙升,但如果我不这样做,那么当我下次绘制时,带有 newSize 的图层将不会创建,我会得到重复的图纸。
所以我需要你的帮助