No borre el context antes de dibujar

Estoy tratando de encontrar una manera de dibujar líneas en una vista sin volver a dibujar todo el context.

Aquí están mis methods de dibujo:

-(void)drawInContext:(CGContextRef)context { for (int i = 0; i < self.drawings.count; ++i) { Drawing* drawing = [self.drawings objectAtIndex:i]; CGContextSetStrokeColorWithColor(context, drawing.colorTrait.CGColor); CGContextSetLineWidth(context, 1.0); CGContextMoveToPoint(context, [[drawing.points objectAtIndex:0] CGPointValue].x * self.zoomScale, [[drawing.points objectAtIndex:] CGPointValue].y * self.zoomScale); for (int i = 1; i < drawing.points.count; i++) { CGContextAddLineToPoint(context, [[drawing.points objectAtIndex:i] CGPointValue].x * self.zoomScale, [[drawing.points objectAtIndex:i] CGPointValue].y * self.zoomScale); } CGContextStrokePath(context); } } -(void)drawRect:(CGRect)rect { if (isRedrawing) { [self drawInContext:UIGraphicsGetCurrentContext()]; isRedrawing = NO; } [[UIColor networkingColor] set]; [currentPath stroke]; } 

Pero cuando invoco setNeedsDisplay en mis methods de toques, la vista se borra por completo. ¿Hay alguna manera de hacer que mi método funcione?

Para bien o para mal uso capas:

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); if (first) { // Wait for the first call to get a valid context first = NO; // Then create a CGContextRef (offlineContext_1) and matching CGLayer (layer_1) layer_1 = CGLayerCreateWithContext (context,self.bounds.size, NULL); offlineContext_1 = CGLayerGetContext (layer_1); // If you have any pending graphics to draw, draw them now on offlineContext_1 } // Normally graphics calls are made here, but the use of an "offline" context means the graphics calls can be made any time. CGContextSaveGState(context); // Write whatever is in offlineContext_1 to the UIView's context CGContextDrawLayerAtPoint (context, CGPointZero, layer_1); CGContextRestoreGState(context); } 

La idea es que a pesar de que el context de UIView siempre se borre, el context fuera de línea asociado con la capa no lo es. Puede seguir acumulando acciones gráficas y no tenerlas borradas por drawRect.

EDITAR: Entonces has señalado una diferencia entre tu problema y el que resolví. No necesitaba dibujar nada hasta después de la primera visualización, mientras que desea dibujar algo antes de la primera visualización. Por lo que recuerdo, puedes crear una capa en cualquier momento a cualquier tamaño y resolución. Descubrí que era más fácil esperar a que se me pasara un context válido (con la configuration correcta para el dispositivo actual) y luego crear un nuevo context / capa basado en ese context. Vea el interior del bloque "if (first)".

Puede hacer lo mismo, pero también tendrá que almacenar en caching las líneas, etc. que obtenga del server hasta que se llame al primer drawRect: A continuación, puede crear el context sin connection con el context dado, dibujar las líneas, etc. que obtuvo del server en el context sin connection y luego dibujar la capa como se muestra a continuación. Por lo tanto, lo único que agregaría al método es una llamada dentro del bucle "if (first)" para dibujar charts de fonts de server pendientes antes de continuar (ver comentario agregado en la fuente).