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);
}
}
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
@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? –
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