2011-06-13 15 views
7

Estoy creando un ImageViewer similar a la aplicación Photos. Tengo un PagingScrollView que es la vista de un controlador de vista (creado en loadView). Las páginas son UIScrollViews con subvistas UIImageView. Todo funciona Hunky Dory hasta que intento 'saltar' (establecer el offset de contenido) a un índice además del primero. Si omito para decir, imagen 'i', la imagen se muestra correctamente, pero si el usuario realiza un solo gesto de toque, el contentOffset se restablece automáticamente para mostrar la imagen '0'. El error no ocurre con otros gestos, como arrastrar, y no ocurre con el tacto si haces otro gesto, como arrastrar primero.UIScrollView establece programáticamente problema contentOffset

Ésta es mi loadView del ImageViewerController

- (void)loadView 
{ 
    //Make the outer spaging scroll view 
    CGRect pagingScrollViewFrame = [self frameForPagingScrollView]; 
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:pagingScrollViewFrame]; 
    scrollView.pagingEnabled = YES; 
    scrollView.backgroundColor = [UIColor blackColor]; 
    scrollView.showsVerticalScrollIndicator = NO; 
    scrollView.showsHorizontalScrollIndicator = NO; 
    scrollView.contentSize = [self contentSizeForPagingScrollView]; 
    scrollView.delegate = self; 
    self.view = scrollView; 
} 

Ésta es la forma en que estoy tratando de establecer el contenido compensado

#define myView (UIScrollView *)self.view 

[myView setContentOffset:[self contentOffsetForIndex:index]]; 

[..] 

- (CGPoint)contentOffsetForIndex:(NSUInteger)index 
{ 
    return CGPointMake((index * (self.view.frame.size.width)), 0); 
} 
+0

¿Quizás publique los reconocedores de gestos? Todo aquí me parece bien. ¿El tap invocar el contentOffset-change de algún tipo? – Jensen2k

+0

No agrego ningún reconocedor de gestos propio. El toque está siendo capturado por la vista de desplazamiento de paginación y reinicia su contentOffset para mostrar la página 0. Mientras lo hago, recibo el mensaje delegado scrollViewDidScroll – Mike

+0

Tengo el mismo problema, en iOS 6. Para iOS 5 funciona bien. También este error desaparecerá una vez que desactive pagingEnabled o si deshabilito la animación de desplazamiento. ¿Alguien sabe una mejor manera de arreglar esto? – AmineG

Respuesta

12

¿Está desplazando horizontal o vertical? su lógica de compensación
CGPointMake((index * (self.view.frame.size.width)), 0); se moverá a 0 del eje Y. EDIT
Yo era un poco perezoso escribiendo el enfoque.
Aquí es el enfoque que adopto para encontrar temas relacionados offset:

a) mediante programación puntero se coloca por setContentOffset :, scrollRectToVisible, setFrame (de UIScrollView, llama internamente SetContentOffset). Primero verifique todos estos en su código, si son correctos.

b) imprime los registros para que la compensación se establezca en el método scrollViewDidScroll:.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    NSLog(@" Offset = %@ ",NSStringFromCGPoint(scrollView.contentOffset)); 
} 

Esto le ayudará a identificar los valores de desplazamiento están establecidos (en la mayoría de los casos, el desplazamiento necesario es anulado por otra llamada a setContentOffset:, en algún lugar en el código; digamos el desplazamiento actual es (130,0) y que desea establecer el offset (300,0) ocurre en las etapas (si es animado), es posible obtener registros como
Offset = {130,0}
Offset = {190,0}
Offset = {220,0}
Offset = {270,0}
Offset = {300,0}

Si hay alguna otra llamada a setContentOffset (animado), digamos que establece offset a (0,0), los registros que obtenga se verían como
Offset = {130,0}
Offset = {190,0}
Offset = {90, 0}
Offset = {220,0}
Offset = {60,0}
Offset = {270,0}
Offset = {30,0}
Offset = {300,0}
Offset = {0,0}

Si observa el segundo patrón en Logs, puede estar seguro de que hay alguna llamada no intencionada para setContentOffset.
3) Una vez que identifica que hay una llamada a una llamada no intencionada a setContentOffset, intente encontrar el origen de la misma (establecer el punto de interrupción para setContentOffset podría ayudar), y puede abordarse caso por caso. por ejemplo:
_adjustContentOffsetIfNecessary, es un método interno llamado cuando frame está configurado para UIScrollView. Esta puede ser la razón (intente aplicar compensación anterior después de establecer el marco).

espero que esta ayuda (mee también, en conseguir el voto hacia abajo eliminado :))

+0

Solo estoy desplazándome horizontalmente. El contentSize.height de la paginación scrollView es lo suficientemente pequeño para que el desplazamiento vertical esté desactivado, así que básicamente quiero que los yPos de contentOffset permanezcan igual. El problema es que la parte x del desplazamiento se restablece con el primer toque – Mike

+0

@ monkybonk05, es posible que vea la edición, espero que ayude. – Tatvamasi

+0

gracias por la sugerencia detallada. No tengo tiempo para probarlo en este momento, pero parece una sugerencia sólida y lo haré cuando pueda. Actualizaré el hilo con los resultados cuando los tenga = D – Mike

1

tengo el mismo problema (un poco) pero mi solución a mi problema era que he deshabilitado la

pagingEnabled 

de UIScrollView ... Cuando su UIScrollview se restablece en un lugar específico al configurar ContentOffset, verifique que su pagingEnabled esté deshabilitado ...

+0

Tengo un problema similar. Yo uso paginación y quiero establecer el desplazamiento. Incluso cuando lo desactivo temporalmente todavía no está configurado. –

Cuestiones relacionadas