2012-05-01 12 views
6

Estoy creando una aplicación de iPhone con una gran imagen panorámica de 360 ​​grados. El panorama es un CATiledLayer en UIScrollView.Desplazamiento infinito - setContentOffset: detiene la desaceleración de UIScrollView

Estoy intentando implementar el desplazamiento infinito en la imagen (solo horizontal). Lo he hecho subclasificando UIScrollView e implementando setContentOffset: y setContentOffset: animated: y esto funciona perfectamente cuando el usuario está arrastrando la vista de desplazamiento. Sin embargo, cuando el usuario ha levantado el dedo y la vista de desplazamiento se está desacelerando, cambiar el contentOffset hace que la desaceleración se detenga instantáneamente.

- (void)setContentOffset:(CGPoint)contentOffset 
{  
    CGPoint tempContentOffset = contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     tempContentOffset = CGPointMake(1, tempContentOffset.y); 
    } 
    else if ((int)tempContentOffset.x <= 0) 
    { 
     tempContentOffset = CGPointMake(5113, tempContentOffset.y); 
    } 

    [super setContentOffset:tempContentOffset];  
} 

¿Hay alguna manera de cambiar el contentOffset sin afectar la desaceleración?

Se sugirió here que sobreescribiendo setContentOffset: (no setContentOffset: animated :) corrige este problema, pero parece que no puedo hacer que funcione.

También he intentado scrollRectToVisible: animado: sin éxito.

Cualquier idea sobre cómo solucionar este problema sería muy apreciada. ¡Gracias!

EDIT:

Código de scrollViewDidScroll:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    [panoramaScrollView setContentOffset:panoramaScrollView.contentOffset]; 
} 

También probé esto:

-(void)scrollViewDidScroll:(PanoramaScrollView *)scrollView 
{ 
    CGPoint tempContentOffset = panoramaScrollView.contentOffset; 

    if ((int)tempContentOffset.x >= 5114) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(1, panoramaScrollView.contentOffset.y); 
    } 
    else if ((int)tempContentOffset.x == 0) 
    { 
     panoramaScrollView.contentOffset = CGPointMake(5113, panoramaScrollView.contentOffset.y); 
    } 
} 

Respuesta

2

I resuelto el problema con una solución. Creé una imagen panorámica con 3 anchos completos de la panorámica (no afecta demasiado el rendimiento porque estoy usando CATiledLayer) y configuré la propiedad decelerationRate en UIScrollViewDecelerationFast. Por lo tanto, el usuario no puede desplazarse demasiado lejos antes de que se detenga la desaceleración, y si la desaceleración se detiene en la imagen panorámica izquierda o derecha, la compensación de contenido se cambia de nuevo a la imagen del medio. Esto tiene la apariencia de un desplazamiento infinito, y es la mejor solución que podría encontrar.

+0

Para evitar la necesidad de 'UIScrollViewDecelerationFast', puede hacer que' contentSize' sea muy grande, comience con su vista de contenido de triple ancho y punto de vista en el centro, y organice esa vista de contenido ser reubicado mientras se desplaza; luego, cuando la desaceleración se detiene, vuelva a colocar todo en el medio. – hatfinch

+0

@hatfinch Gracias por tu comentario. Eso es más o menos lo que terminé haciendo, pero no estoy 100% seguro de lo que querías decir con "organizar que la vista de contenido se reposicione mientras se desplaza". ¿Puedes explicarme cómo funcionaría esto? –

+0

Funcionaría igual que el método que describió, excepto que en lugar de paralizar la desaceleración para garantizar que el usuario no pueda deslizarse fuera del panorama de triple ancho, moverá la panorámica. Entonces, para una ABC de "vista de contenido", tiene xxxABCxxx en la vista de desplazamiento (x es solo espacio en blanco), y cuando el usuario se desplaza, por ejemplo. a la izquierda, después de que hayan desplazado un ancho de imagen, mueva la vista de contenido para que tenga xxABCxxxx. Excepto que lo haces con tantas "x" que tendrían que ser muy deliberadas para tratar de llegar al límite. ¿Tiene sentido? – hatfinch

0

me gustaría probar a utilizar el método de protocolo de UIScrollViewDelegate:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView; 

se llama al usuario desplazarse (incluso cuando está desacelerando)

y en su interior que cambiaría la contentoffset

+0

El método scrollViewDidScroll es donde yo estoy llamando el método setContentOffset se muestra arriba. También intenté configurar directamente el contentOffset en scrollViewDidScroll, pero no tuve suerte. Cada vez que se establece el desplazamiento de contenido, la desaceleración se detiene instantáneamente. La salida de registro a continuación muestra el cambio de compensación de contenido, y luego se activa scrollViewDidEndDecelerating. '(62.000000 0.000000) (22.000000 0.000000) (0.000000 0.000000) (5113.000000 0.000000) scrollViewDidEndDecelerating' –

+0

cómo? publique el código de su scrollViewDidScroll ... – meronix

0

Hace poco estaba haciendo lo mismo desplazamiento infinito y accidentalmente encontró la solución:

acaba de establecer bounces=YES, alwaysBounceHorizontal=YES y/o alwaysBounceVertical=YES (depende de la dirección en la que el desplazamiento a).

Eso es, esto funciona para mí.:)

1

En lugar de

[scrollView setContentOffset:tempContentOffset]; 

uso

scrollView.contentOffset = tempContentOffset; 
Cuestiones relacionadas