2015-06-11 2 views
15

Sto provando a limitare la velocità di scorrimento del mio UITableView, esattamente come Instagram lo fa.Limita velocità di scorrimento UITableView come Instagram

Se controlli su Instagram, noterai che hanno un limite alla velocità di scorrimento del feed.

Non è impostato utilizzando "decelerationRate" poiché il limite non influisce sulla decelerazione. Influisce semplicemente sulla velocità di scorrimento del feed. Quindi, se provi a fare un gesto "flick", colpirai la velocità massima di scorrimento di Instagrams e non andrai più veloce di un normale UITableView.

Qualche ipotesi su come Instagram realizza questo?

+2

Perché pensi che Instagram sta facendo qualcosa di speciale? Non provo alcun limite di velocità di scorrimento quando provo a riprodurre. – thelaws

+0

@thithow sicuramente scorre più lento in qualche modo. Quando scorri il feed come faresti normalmente e provi a scorrere un altro feed in un'altra app, Instagram sembra molto più fluido. –

+1

Sembra che sia molto fluido, ma non lento affatto. – k06a

risposta

13

TableView ha una proprietà scrollView, questa proprietà restituirà scrollView interno di TableView. Usa dopo ...

tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

altro modo:

TableView risponderà alle ScrollView delegato, quindi abbiamo bisogno di implementare il delegato di ScrollView come:

Prendete queste variabili globali:

CGPoint lastOffset; 
NSTimeInterval lastOffsetCapture; 
BOOL isScrollingFast; 

Implementare scrollViewDidScroll come:

- (void) scrollViewDidScroll:(UIScrollView *)scrollView {  
    CGPoint currentOffset = scrollView.contentOffset; 
    NSTimeInterval currentTime = [NSDate timeIntervalSinceReferenceDate]; 

    NSTimeInterval timeDiff = currentTime - lastOffsetCapture; 
    if(timeDiff > 0.1) { 
     CGFloat distance = currentOffset.y - lastOffset.y; 
     //The multiply by 10,/1000 isn't really necessary....... 
     CGFloat scrollSpeedNotAbs = (distance * 10)/1000; //in pixels per millisecond 

     CGFloat scrollSpeed = fabsf(scrollSpeedNotAbs); 
     if (scrollSpeed > 0.5) { 
      isScrollingFast = YES; 
      NSLog(@"Fast"); 
     } else { 
      isScrollingFast = NO; 
      NSLog(@"Slow"); 
     }   

     lastOffset = currentOffset; 
     lastOffsetCapture = currentTime; 
    } 
} 

quindi implementare scrollViewDidEndDragging come questo:

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if(!decelerate) 
    { 
     NSUInteger currentIndex = (NSUInteger)(scrollView.contentOffset.x/scrollView.bounds.size.width); 

     [scrollView setContentOffset:CGPointMake(scrollView.bounds.size.width * currentIndex, 0) animated:YES]; 
    } 
} 

Spero che questo può aiutare ...

+0

Grazie per la risposta. Sono abbastanza sicuro che non funzionerà comunque. "decelerationRate" controlla solo la decelerazione, quindi sicuramente non funzionerà. Anche l'impostazione del punto per scorrere manualmente utilizzando un'animazione non funzionerà. L'utente non ha la sensazione di decelerare quando si tratta semplicemente di un'animazione. Altre opzioni? –

+0

Prova a guardare instagram e prova a sfogliare il feed principale e vedrai cosa sto cercando. –

+0

Basta provare entrambe le opzioni, ho usato la seconda opzione e funziona molto bene per me. Ci vorranno solo 5 minuti per provare questa opzione. –

5

Utilizzare questa:

self.tableview.scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Come tableView è una sottoclasse di UIScrollView, ScrollView delegato sarà lavoro qui. Spero che questo aiuti .. :)

Edit:

se tableView non mostra alcune stanze sono ScrollView:

self.tableView.decelerationRate 
+0

Grazie per la risposta. "decelerationRate" controlla semplicemente la velocità di decelerazione e non ha nulla a che fare con la velocità generale, quindi non funzionerà. Guarda Instagram e prova a sfogliare il feed principale e vedrai cosa sto cercando. –

+0

non accetta self.tableview.scrollView – Abhishek

+1

@Abhishek> Vedi la mia modifica. – Rashad