2012-05-01 21 views
6

Sto creando un'app per iPhone con una grande immagine panoramica a 360 gradi. Il panorama è un CATiledLayer in un UIScrollView.Scorrimento infinito - setContentOffset: arresta decelerazione di UIScrollView

sto cercando di implementare lo scorrimento infinito sull'immagine (solo orizzontale). Ho fatto questo sottoclassi UIScrollView e implementando setContentOffset: e setContentOffset: animated: e questo funziona perfettamente quando l'utente sta trascinando la scrollview. Tuttavia, quando l'utente ha sollevato il dito e la vista a scorrimento è in decelerazione, la modifica di contentOffset determina l'arresto immediato della decelerazione.

- (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];  
} 

C'è un modo per modificare contentOffset senza influire sulla decelerazione?

È stato suggerito here che esegue l'override di setContentOffset: (non setContentOffset: animated :) risolve questo problema, ma non riesco a farlo funzionare.

Ho anche provato scrollRectToVisible: animato: senza successo.

Qualsiasi idea su come risolvere questo problema sarebbe molto apprezzata. Grazie!

EDIT:

Codice per scrollViewDidScroll:

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

Ho provato anche questo:

-(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); 
    } 
} 

risposta

2

ho risolto il problema con una soluzione. Ho creato un'immagine panoramica con 3 ampiezze complete del panorama (non influisce troppo sulle prestazioni perché sto utilizzando CATiledLayer) e imposta la proprietà decelerationRate su UIScrollViewDecelerationFast. Pertanto, l'utente non è in grado di scorrere troppo lontano prima che la decelerazione si arresti e, se la decelerazione si interrompe nell'immagine panoramica sinistra o destra, l'offset del contenuto viene quindi modificato all'immagine centrale. Questo ha l'aspetto di scrolling infinito ed è la soluzione migliore che potrei inventare.

+0

Per evitare la necessità di 'UIScrollViewDecelerationFast', potresti rendere' contentSize' molto grande, iniziare con la vista del contenuto a tripla larghezza e il punto di vista nel mezzo e organizzare quella vista del contenuto essere riposizionato durante lo scorrimento; poi, quando la decelerazione si ferma, rimetti tutto di nuovo in mezzo. – hatfinch

+0

@hatfinch Grazie per il tuo commento. Questo è più o meno quello che ho finito, ma non sono sicuro al 100% di cosa intendessi per "organizzare la visualizzazione del contenuto da riposizionare durante lo scorrimento". Puoi spiegare come funzionerebbe? –

+0

Funzionerebbe esattamente come il metodo che hai descritto, ma invece di paralizzare la decelerazione per garantire che l'utente non possa scorrere il panorama a larghezza tripla, stai spostando il panorama. Quindi, per una "visualizzazione del contenuto" ABC, hai xxxABCxxx nella scrollview (x è solo uno spazio vuoto) e quando l'utente scorre ad es. a sinistra, dopo aver spostato una larghezza dell'immagine, si sposta la vista del contenuto in modo da avere xxABCxxxx. Tranne che lo fai con così tante "x" che dovrebbero essere molto intenzionali nel cercare di raggiungere il limite. Ha senso? – hatfinch

0

vorrei provare a utilizzare il metodo di protocollo UIScrollViewDelegate:

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

si chiama quando scrollare su e giù (anche quando è in decelerazione)

e al suo interno vorrei cambiare il contentOffset

+0

Il metodo scrollViewDidScroll è dove sto chiamando il metodo setContentOffset mostrato sopra. Ho anche provato a settare direttamente contentOffset in scrollViewDidScroll, ma senza fortuna. Ogni volta che viene impostato l'offset del contenuto, la decelerazione si interrompe istantaneamente. L'output del registro seguente mostra la modifica dell'offset del contenuto, quindi viene avviato scrollViewDidEndDecelerating. '(62,000000 0,000000) (22,000000 0,000000) (0,000000 0,000000) (5113,000000 0,000000) scrollViewDidEndDecelerating' –

+0

come? inserisci il codice del tuo scrollViewDidScroll ... – meronix

0

ho recentemente stavo facendo lo stesso scorrimento infinito e accidentalmente trovato la soluzione:

Basta impostare bounces=YES, alwaysBounceHorizontal=YES o/e alwaysBounceVertical=YES (dipende dalla direzione di scorrimento a).

Ecco, questo funziona per me.:)

1

Invece di

[scrollView setContentOffset:tempContentOffset]; 

uso

scrollView.contentOffset = tempContentOffset; 
Problemi correlati