2012-04-03 9 views
5

Tengo un problema que parece que no puedo solucionar. Estoy tratando de tomar una captura de pantalla de un UIScrollView (incluido el contenido fuera de la pantalla), pero cuando la vista es larga, el renderInContext no obtiene todo el contenido de la vista de desplazamiento. Las dimensiones de la imagen producida son correctas, pero parece que los datos renderizados faltan trozos de la pantalla, dejando un espacio en blanco donde deberían estar esos trozos. Los bloques que faltan provienen del contenido de un UIWebView, que creo que está configurado como "scaleToFit". No ocurre siempre, parece que solo ocurre cuando la altura de UIWebView es bastante grande. Lo que me hace pensar que tiene que ver con el escalado de UIWebView.¿Cómo se arreglan los "bloques" de datos faltantes cuando se toman capturas de pantalla en un dispositivo con iOS?

Si ajusto coreLayer.bounds CGRECT a continuación, obtengo resultados diferentes, a veces los bloques faltantes están en la parte inferior y, a veces, están en el centro de la imagen.

Empecé con el código de la respuesta aceptada de esta question y cuando me di cuenta el tema de corte, he modificado a lo siguiente:

UIGraphicsBeginImageContext(scrollView.contentSize); 
{ 
    CGPoint savedContentOffset = scrollView.contentOffset; 
    CGRect savedFrame = scrollView.frame; 


    //hide the scroll bars 
    [scrollView setShowsHorizontalScrollIndicator:NO]; 
    [scrollView setShowsVerticalScrollIndicator:NO]; 


    scrollView.contentOffset = CGPointZero; 
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    //adjust layer for cut-off 
    CALayer *coreLayer = scrollView.layer; 
    coreLayer.bounds = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); 
    [coreLayer renderInContext: UIGraphicsGetCurrentContext()]; 
    //[scrollView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
    image = UIGraphicsGetImageFromCurrentImageContext(); 

    scrollView.contentOffset = savedContentOffset; 
    scrollView.frame = savedFrame; 


    //reset the scroll bars to default 
    [scrollView setShowsHorizontalScrollIndicator:YES]; 
    [scrollView setShowsVerticalScrollIndicator:YES]; 
} 
UIGraphicsEndImageContext(); 

El ajuste de corte ayudó (fijado con algunos puntos de vista) pero aún se está cortando cuando UIScrollView es bastante largo. He estado trabajando en esto por un tiempo y parece que no puedo encontrar una solución. ¿Tienes alguna sugerencia? ¿Alguien ha encontrado este problema?

Por favor ayuda!

+0

Solo un pensamiento, pero ¿ha considerado temporalmente cambiar scrollView.frame.size a scrollView.contentSize? Esto requerirá que la vista de tabla cargue todas las celdas, ya que encajan en el marco (el contenido de la memoria caché de las vistas de tabla está fuera de su marco, no fuera de la pantalla). – Kalle

Respuesta

0

¿Su vista de desplazamiento es una vista de tabla? Si es así, prácticamente solo existe el contenido en pantalla debido a la reutilización de la celda. Incluso si se trata de una vista de desplazamiento normal, es plausible que el sistema operativo esté optimizando al no mostrar algunos elementos fuera de pantalla de la vista de desplazamiento. Si eso es cierto, puede hacer que esto funcione al desplazarse programáticamente una pantalla por vez y presentar cada una de ellas en su contexto en la posición correcta.

+0

Sí, eso es exactamente lo que está haciendo y tuve que averiguar cuánto se representa realmente. Lo que encontré fue que generalmente hay 3 "bloques" que se pueden ver a la vez. Luego, mientras se desplaza por UIScroll, vea esos contenidos de re-draw basados ​​en la dirección del desplazamiento. Así que estoy tomando una captura de pantalla del área de 3 paneles, desplazándola a los próximos 3 paneles visibles, etc., etc. – thiesdiggity

+0

Le advierto que se asegure de que su código no tenga el número 3 codificado. El número de filas que se extraen fuera de la pantalla puede ser un detalle de implementación que podría cambiar con una nueva versión del sistema operativo o incluso ser diferente en otro dispositivo, según las capacidades disponibles de la memoria RAM o la GPU. –

Cuestiones relacionadas