CATiledLayer se quita y actualiza mientras se hace zoom en la tercera generación del iPad.

Estoy experimentando un problema de networkingibujado en un CATiledLayer cuando se enfoca el UIScrollView primario.

Estoy renderizando una página PDF en una UIView respaldada por CATiledLayer. Tiene otra UIImageView detrás de ella, que contiene una image de baja resolución de la página que dibujará el CATiledLayer. Cuando acerco, funciona como se esperaba. El CATiledLayer mostrará una image de mayor resolución según el nivel de zoom.

El problema ocurre después del zoom. Si acerco y luego abandono el iPad solo, la image mostrada se desdibuja y luego se vuelve a afilar. Parece que CATiledLayer está siendo eliminado, ya que veo la image borrosa de baja resolución en la vista de respaldo, luego el CATiledLayer se vuelve a dibujar, es decir, veo el efecto de embaldosado y el reafilado de la image. Esto sucede si solo dejo la aplicación sola y espero unos 30 a 40 segundos. Lo he observado en la tercera generación de iPad (nuevo iPad, iPad3, lo que sea). También estoy probando en iPad2 y todavía tengo que encontrar el problema.

¿Alquien más se ha encontrado con este problema? ¿Alguna causa conocida y, posiblemente, soluciones?

Editar:

Mis methods UIScrollViewDelegate son los siguientes:

// currentPage, previousPage, and nextPage are the pdf page views // that are having the refresh problem - (void)positionBuffenetworkingPages { // performs math {code omitted} // then sets the center of the views [previousPage.view setCenter:...]; [nextPage.view setCenter:...]; } - (void)hideBuffenetworkingPages { if ([previousPage.view isDescendantOfView:scrollView]) { [previousPage.view removeFromSuperview]; } if ([nextPage.view isDescendantOfView:scrollView]) { [nextPage.view removeFromSuperview]; } } - (void)showBuffenetworkingPages { if (![previousPage.view isDescendantOfView:scrollView]) { [scrollView addSubview:previousPage.view]; } if (![nextPage.view isDescendantOfView:scrollView]) { [scrollView addSubview:nextPage.view]; } if (![currentPage.view isDescendantOfView:scrollView]) { [scrollView addSubview:currentPage.view]; } } - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return currentPage.view; } - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view { [self hideBuffenetworkingPages]; } - (void)scrollViewDidEndZooming:(UIScrollView *)scrollViewParam withView:(UIView *)view atScale:(float)scale { [self positionBuffenetworkingPages]; [self showBuffenetworkingPages]; } - (void)scrollViewDidZoom:(UIScrollView *)scrollView { // nothing relating to the pdf page view // but does set the center of some other subviews on top of the pdf page views } 

No estoy seguro de lo útil que será esto, ya que el scrollview no está recibiendo información mientras el problema ocurra. Como se mencionó anteriormente, la página de pdf se carga en CATiledLayer, luego dejo el iPad solo (el dispositivo no recibe ninguna input), y el CATiledLayer se volverá a dibujar por sí mismo.

También intenté capturar llamadas a setNeedsDisplay , setNeedsDisplayInRect: setNeedsLayout y setNeedsDisplayOnBoundsChange: tanto en la vista como en la capa de mosaico, pero el cambio de layout ocurre sin que ninguna de las funciones se llame. drawLayer:inContext: se llama, por supuesto, pero la traza solo muestra algunas llamadas de cuarzo que se inician en un hilo de background (como se esperaba, ya que las capas de mosaico preparan el contenido en segundo plano), por lo que tampoco es de ayuda.

¡Gracias por adelantado!

¿Cómo se ve el uso de la memory de su aplicación? CATiledLayer descartará su caching y volverá a dibujar si se produce una advertencia de memory. Lo he visto hacer esto incluso sin que se envíen advertencias de memory a la aplicación (solo una carga de memory superior a la habitual). Use los instrumentos para ver el uso de la memory. Es posible que necesite usar el instrumento OpenGL ES Driver para ver qué sucede con la memory de charts.

He tenido exactamente el mismo problema. En mi caso, fue causado por el uso de la function UIGraphicsBeginImageContext (); esta function no tiene en count la escala, lo que da problemas en una pantalla retina. La solución fue replace la llamada con UIGraphicsBeginImageContextWithOptions (), con el parámetro scale (= third) establecido en 0.0.

Si basó su código en el código de ejemplo de Zooming PDF Viewer de Apple, como lo hice, es probable que esto solucione su problema también.

Longshot, ¿hay alguna posibilidad de que llame a algún método en las vistas desde el hilo no principal? Todo tipo de cosas inesperadas y funky pueden suceder si lo haces.

Hablé con un ingeniero de Apple sobre esto y la respuesta corta es que iOS solo tiene una cantidad de memory X disponible para almacenar en caching un CATiledLayer y en la pantalla Retina del iPad, hay demasiados píxeles para usar más de una capa.

Había estado usando dos CATileLayers para mostrar una vista de map y una vista de dibujo en la parte superior. Eliminé el segundo CATiledLayer y el problema desapareció.