iphone - not - UIScrollView establece programáticamente el problema de ContentOffset
scrollview xcode (2)
Estoy creando un ImageViewer similar a la aplicación Fotos. 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 salteo para decir, imagen ''i'', la imagen se muestra correctamente, pero si el usuario realiza un solo gesto de toque, 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.
Esta 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;
}
Así es como estoy tratando de configurar el contenido offset
#define myView (UIScrollView *)self.view
[myView setContentOffset:[self contentOffsetForIndex:index]];
[..]
- (CGPoint)contentOffsetForIndex:(NSUInteger)index
{
return CGPointMake((index * (self.view.frame.size.width)), 0);
}
¿Estás desplazándote horizontal o verticalmente? su lógica de compensación
CGPointMake((index * (self.view.frame.size.width)), 0);
se moverá a 0 del eje Y EDITAR
Era un poco perezoso escribiendo el enfoque.
Este es el enfoque que adopto para encontrar problemas relacionados con el offset:
a) Offset programáticamente establecido por setContentOffset :, scrollRectToVisible, setFrame (de UIScrollView, internamente llamadas SetContentOffset). Primero verifique todos estos en su código, si son correctos.
b) imprima los Logs para la compensación que se establece en el método scrollViewDidScroll:
.
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@" Offset = %@ ",NSStringFromCGPoint(scrollView.contentOffset));
}
Esto le ayudará a identificar los valores de compensación que se están configurando (en la mayoría de los casos, el desplazamiento requerido es anulado por otra llamada a setContentOffset:, en algún lugar del código; digamos que el desplazamiento actual es (130,0) y desea establecer el offset (300,0) sucede en pasos (si está animado), puede 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 (animada), digamos que establece el desplazamiento en (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 identifique que hay una llamada a una llamada no intencionada para establecerContenidoOffset, intente encontrar el origen de la misma (configurar el punto de interrupción para setContentOffset podría ayudar), y puede abordarse caso por caso. por ejemplo:
_adjustContentOffsetIfNecessary
, se llama a un método interno 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 esto ayude (a mí también, para que se elimine el voto negativo :))
Tengo el mismo problema (un poco) pero mi solución a mi problema fue que desactivé
pagingEnabled
de UIScrollView ... Cuando su UIScrollview se restablece a un lugar específico al configurar ContentOffset, verifique que su pagingEnabled esté desactivado ...