2011-04-14 10 views
5

Tengo un UIScrollView en el que el desplazamiento vertical solo está habilitado. Estoy mostrando una grilla de botones (similar a la cuadrícula de la imagen del visor de fotos). La cuadrícula se debe dibujar de forma diferente en función de la orientación de la pantalla, de modo que se utilice todo el espacio de la pantalla. Dado el tamaño de mis botones, puedo poner 3 por fila en el retrato y 4 por fila en el paisaje.UIScrollView se desplaza automáticamente hacia arriba después de SetContentSize durante el cambio de orientación. ¿Cómo puedo evitarlo?

Reubico todos los botones en: willRotateToInterfaceOrientation: duration y luego call: setContentSize: en mi UIScrollView. Todo parece funcionar bien, con la excepción del desplazamiento automático que ocurre después de la llamada a SetContentSize :. En otras palabras, digamos que estaba en retrato, y recorrí 3/4 del camino hacia abajo en la lista, cuando giro en horizontal, se desplaza automáticamente por toda la copia de seguridad hacia arriba.

Lo interesante es que, en el mismo escenario, si tuviera que hacer una pequeña película hacia arriba o hacia abajo, y luego girar inmediatamente el dispositivo, ¡la vista de desplazamiento se redibuja correctamente y conserva la posición de desplazamiento actual!

Por lo tanto, para ser claros, el culpable aquí parece ser SetContentSize :, pero obviamente tengo que llamar para que la vista de desplazamiento se desplace correctamente.

¿Alguna idea sobre cómo puedo mantener la posición de desplazamiento actual?

Gracias!

Respuesta

1

Puede intentar implementar el método UIScrollViewDelegatescrollViewShouldScrollToTop:, que indica a la persona que llama si desplazarse hacia la parte superior o no. Es posible que tengas que tener alguna bandera en tu delegado que indique si una rotación está en curso o no, porque en condiciones normales, es posible que desees la posibilidad de tocar la barra de estado y hacer que la vista de desplazamiento se desplace hasta la parte superior.

Si, por otro lado, no desea que la vista de desplazamiento vaya automáticamente a la parte superior, simplemente implemente ese método de delegado y haga que devuelva NO.

+0

Esto no tiene' t trabajo. Esto tiene el mismo efecto que usar: scrollView.scrollsToTop = NO; Lo cual, sí, evita que el desplazamiento automático llegue a la parte superior cuando tocas la barra de estado; sin embargo, el comportamiento que describí en mi pregunta original aún persiste ... – bpatrick100

+0

Otra idea: antes de llamar a 'setContentSize:', recuerda dónde en el contenido que eres, luego de esa llamada, llama a 'setContentOffset:'. Puede ser que cuando se establece el tamaño del contenido, el desplazamiento del contenido se reinicie a propósito (0,0). Es posible que haya restablecido el tamaño del contenido a algo que ya no incluye el offset de contenido antes de restablecer el tamaño. Por lo tanto, el SDK quizás se esté protegiendo a sí mismo y a la experiencia del usuario hasta cierto punto al garantizar que siempre se muestre algo después de que cambie el tamaño de un contenido. –

0

he tenido este problema, acabo de hacer esto y funciona bien para mí

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    //calculate percentage down scrollview currently at 
    float c = self.scrollView.contentOffset.y/self.scrollView.contentSize.height; 

    //reposition subviews in the scrollview 
    [self positionThumbnails:toInterfaceOrientation]; 

    //set the new scrollview offset to the same percentage, 
    // using the new scrollview height to calculate 
    self.scrollView.contentOffset = 
      CGPointMake(0, c * self.scrollView.contentSize.height); 
} 

En mi caso, tengo una ScrollView con un ancho fijo para el tamaño del dispositivo y altura variable

Cuestiones relacionadas