2012-02-03 9 views
5

Tengo una vista de mapa personalizada que está hecha de UIScrollView. La subvista de la vista de desplazamiento está respaldada por CATiledLayer. Todo funciona bien aquí. La panorámica & de zoom carga nuevos mosaicos de mapas y todo funciona bien.tomando una instantánea de imagen de la vista respaldada por CATiledLayer en UIScrollView

Lo que quiero hacer es capturar marcos de video de animaciones en esta vista de desplazamiento. Básicamente, quiero crear un video de cambios animados en la vista de desplazamiento contentOffset y zoomScale.

Sé que el concepto es sólido ya que puedo obtener la función de API privada UIGetScreenImage() para capturar la pantalla de la aplicación a, digamos, 10 fps, combinar estas imágenes, y obtengo animaciones de reproducción que son suaves y las curvas de tiempo utilizadas por las animaciones de la vista de desplazamiento.

Mi problema, por supuesto, es que no puedo usar la API privada. Pasar por las alternativas descritas por Apple here me deja con casi una opción supuestamente válida: pidiendo un CALayer a renderInContext y tomando un UIGraphicsGetImageFromCurrentImageContext() de eso.

Esto simplemente no parece funcionar con CATiledLayer -backed views, though. Una imagen en bloque, sin zoom es lo que se captura, como si las fichas de mayor resolución nunca se cargaran. Esto tiene sentido, dado que CATiledLayer dibuja hilos de fondo para el rendimiento y llamar al renderInContext del hilo principal podría no detectar estas actualizaciones. El resultado es similar incluso si represento la capa de mosaico presentationLayer también.

¿Existe una forma sancionada por Apple de capturar una imagen de una vista respaldada CATiledLayer durante el curso de las animaciones de la vista de desplazamiento? O en cualquier punto, para el caso?

+0

Alguien envió la respuesta aquí: http://stackoverflow.com/questions/5526545/render-large-catiledlayer-into-smaller- área –

Respuesta

1

Por cierto, esto es factible si implementa correctamente renderLayer:inContext: en su vista respaldada CATiledLayer.

0

Hice una prueba rápida, y usando renderInContext: en una vista envolviendo la vista de desplazamiento parecía funcionar. ¿Has probado eso?

+0

Sí. He puesto un ejemplo de código que demuestra este problema de manera más sucinta: https://github.com/incanus/TiledLayerSnapTest Tenga en cuenta que una captura de un 'UIView' común funciona bien, pero la vista' CATiledLayer'-backed aparece en blanco gris. – incanus

0

Este código funciona para mí.

- (UIImage *)snapshotImageWithView:(CCTiledImageScrollView *)view 
{ 
// Try our best to approximate the best tile set zoom scale to use 
CGFloat tileScale; 
if (view.zoomScale >= 0.5) { 
    tileScale = 2.0; 
} 
else if (view.zoomScale >= 0.25) { 
    tileScale = 1.0; 
} 
else { 
    tileScale = 0.5; 
} 

// Calculate the context translation based on how far zoomed in or out. 
CGFloat translationX = -view.contentOffset.x; 
CGFloat translationY = -view.contentOffset.y; 
if (view.contentSize.width < CGRectGetWidth(view.bounds)) { 
    CGFloat deltaX = (CGRectGetWidth(view.bounds) - view.contentSize.width)/2.0; 
    translationX += deltaX; 
} 
if (view.contentSize.height < CGRectGetHeight(view.bounds)) { 
    CGFloat deltaY = (CGRectGetHeight(view.bounds) - view.contentSize.height)/2.0; 
    translationY += deltaY; 
} 

// Pass the tileScale to the context because that will be the scale used in drawRect by your CATiledLayer backed UIView 
UIGraphicsBeginImageContextWithOptions(CGSizeMake(CGRectGetWidth(view.bounds)/view.zoomScale, CGRectGetHeight(view.bounds)/view.zoomScale), NO, tileScale); 
CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(context, translationX/view.zoomScale, translationY/view.zoomScale); 

// The zoomView is a subview of UIScrollView. The CATiledLayer backed UIView is a subview of the zoomView. 
[view.zoomView.layer renderInContext:context]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return image; 

}

código de ejemplo completo encontrar aquí: https://github.com/gortega56/CCCanvasView

Cuestiones relacionadas