2011-08-05 19 views
9

Estoy realizando algunas operaciones de dibujo CG en un CGContext que creé para MKMapOverlayView. Después de dibujar en mi contexto, creo una imagen y la pego en el contexto proporcionado por MapKit.Copie CGContext en otro CGContext

- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context { 
    CGColorSpaceRef colorRef = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef myContext = CGBitmapContextCreate(NULL, kTileSize, kTileSize, 8, 0, colorRef, kCGImageAlphaPremultipliedLast); 
    CGColorSpaceRelease(colorRef); 
    CGContextSetAllowsAntialiasing(myContext, TRUE); 
    //...cut out drawing operations... 
    CGImageRef image = CGBitmapContextCreateImage(myContext); 
    CGContextDrawImage(context, [self rectForMapRect:mapRect], image); 
    CGImageRelease(image); 
    CGContextRelease(myContext); 
} 

¿Hay una manera de simplemente copiar myContext en context sin tener que crear una imagen?

Me doy cuenta de que algunos de ustedes dirán "¿por qué no dibujar directamente en el contexto que proporciona MapKit?". Lamentablemente, estamos experimentando un problema de dibujo al representar directamente en context. Apple actualmente está investigando este problema para nosotros, pero mientras tanto tenemos que encontrar una solución. Esta solución que presenté arriba es mi "mejor" oportunidad, pero está un poco lenta.

P.S. He comenzado una recompensa ya que estoy buscando una respuesta aquí también. Específicamente me estoy enfocando en OS X. Entonces la respuesta debería funcionar allí. El OP estaba buscando una respuesta en iOS.

+0

¿Encontró una solución adecuada para el problema? Me enfrento al mismo problema en este momento ... – Georg

+0

Desafortunadamente, no ... a pesar de que 'CGFloat' es un' doble' en dispositivos iOS de 64 bits, el gran número entero y la fracción aún mayor aún presentan suficiente jitter cuando haciendo cambios muy pequeños al mosaico del mapa. –

Respuesta

1

Puede usar un CGLayerRef. El ref de capa es como un subcontexto al que puedes dibujar un montón, y luego aplanarlo en el contexto original cuando terminas de dibujar el valor de la capa.

Normalmente se utiliza para compartir alfa o sombras en muchas llamadas de dibujo en lugar de cada llamada individual.

No sé si esto solucionará cualquier error que encuentre, o si el rendimiento es mejor o peor que el enfoque de dos contextos. Necesitaría saber más sobre sus objetivos y requisitos. Por ejemplo, ¿desea evitar el uso de dos contextos para evitar una segunda copia, o porque no desea pagar la memoria de la segunda imagen?

Cuestiones relacionadas