que estoy experimentando un problema de redibujo en un CATiledLayer cuando el UIScrollView padre se ha ampliado.CATiledLayer siendo retirado y refrescado la imagen ampliada iPad 3ª generación
Estoy prestando una página PDF en un CATiledLayer respaldado UIView. Tiene otro UIImageView detrás de él, que contiene una imagen de baja resolución de la página que dibujará CATiledLayer. Cuando hago zoom, funciona como se esperaba. El CATiledLayer renderizará una imagen de mayor resolución de acuerdo con el nivel de zoom.
El problema ocurre después del acercamiento. Si hago zoom, simplemente deje el iPad solo, la imagen mostrada se borra y luego se reafirma. Parece que se está eliminando CATiledLayer, ya que veo la imagen borrosa de baja resolución en la vista de respaldo, luego el CATiledLayer se vuelve a dibujar, es decir, veo el efecto de mosaico y el reafilado de la imagen. Esto sucede si dejo la aplicación solo y espero entre 30 y 40 segundos. Solo lo he observado en el iPad de tercera generación (nuevo iPad, iPad3, lo que sea). También estoy probando en iPad2s y todavía no he encontrado el problema.
¿Alguien más ha encontrado este problema? ¿Alguna causa conocida y, posiblemente, soluciones?
Editar:
Mis métodos UIScrollViewDelegate son los siguientes:
// currentPage, previousPage, and nextPage are the pdf page views
// that are having the refresh problem
- (void)positionBufferedPages {
// performs math {code omitted}
// then sets the center of the views
[previousPage.view setCenter:...];
[nextPage.view setCenter:...];
}
- (void)hideBufferedPages {
if ([previousPage.view isDescendantOfView:scrollView]) {
[previousPage.view removeFromSuperview];
}
if ([nextPage.view isDescendantOfView:scrollView]) {
[nextPage.view removeFromSuperview];
}
}
- (void)showBufferedPages {
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 hideBufferedPages];
}
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollViewParam withView:(UIView *)view atScale:(float)scale {
[self positionBufferedPages];
[self showBufferedPages];
}
- (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 está seguro de lo útil que será, sin embargo, como el ScrollView no está recibiendo la carga, mientras que el problema ocurre. Como se mencionó anteriormente, la página pdf se carga en CATiledLayer, luego dejo solo el iPad (el dispositivo no recibe ninguna entrada) y CATiledLayer se redibujará solo.
También he intentado llamadas a la captura de setNeedsDisplay
, setNeedsDisplayInRect:
, setNeedsLayout
y setNeedsDisplayOnBoundsChange:
tanto en la vista y la capa de tejas, pero el redibujado sucede sin ninguna de esas funciones recibiendo llamadas. drawLayer:inContext:
se llama, por supuesto, pero la traza solo muestra algunas llamadas de Cuarzo que se inician en una cadena de fondo (como se esperaba, ya que las capas de mosaico preparan el contenido en segundo plano), por lo que tampoco sirve de nada.
¡Gracias de antemano!
¿Podría ser por la pantalla de retina de alta resolución del ipad 3? ¿Está configurando correctamente el contenido de CATiledLayer? También en el código de representación de creación de PDF personalizado debe utilizar UIGraphicsBeginImageContextWithOptions y establecer la escala en consecuencia – Lefteris
No estoy usando UIGraphicsBeginImageContextWithOptions, pero utilizo CGContextScaleCTM para establecer la escala. ¿Hay una diferencia? Parece que estoy renderizando el pdf correctamente. Mi problema es que CATiledLayer de alguna manera se redibuja sin razón alguna después de un tiempo. – Altealice
Debe establecer CATiledLayer contentsScale en la escala [[UIScreen mainScreen]] – Lefteris