2009-07-09 13 views
32

C'è un modo per disattivare la decelerazione di un UIScrollView?Disattivare UIScrollView in decelerazione

Desidero consentire all'utente di scorrere la tela, ma non voglio che la tela continui a scorrere dopo che l'utente ha sollevato il dito.

+1

Perché dovresti farlo? –

+5

Adam, Sono consapevole che la modifica del comportamento predefinito non è raccomandabile, ma penso che nel mio caso speciale avrebbe senso. Sto implementando una tela estesa con la possibilità di modificare gli oggetti direttamente sulla tela. Quando si accede a questa modalità di modifica su tela, desidero limitare la distanza di scorrimento dell'utente in modo che l'oggetto si trovi sempre nell'intervallo visibile. L'uso è permesso di scorrere ulteriormente, ma rimbalzerebbe sul dito verso l'alto. Sono a conoscenza della proprietà contentSize, ma interferisce con la mia tela in crescita. –

+2

Nella mia situazione, stavamo facendo pagare per il lavoro di noleggio e il cliente ha chiesto di rimuovere la mozione di decelerazione. – Mark

risposta

60

Questo può essere fatto utilizzando il metodo delegato UIScrollViewscrollViewWillBeginDecelerating per impostare automaticamente l'offset del contenuto sulla posizione corrente dello schermo.

da implementare:

  1. assegnare un delegato per la vostra UIScrollView oggetto se non l'avete già fatto.
  2. Nel file di implementazione .m del delegato, aggiungere le seguenti righe di codice:

    -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ 
        [scrollView setContentOffset:scrollView.contentOffset animated:YES]; 
    } 
    

Voila! Non più scorrimento automatico.

+1

Bello. Non ho idea del perché, ma funziona. Grazie! –

+0

Il mio salta a dove la decelerazione sarebbe finita di nuovo dove era iniziato ... Qualche suggerimento? – jjxtra

+0

Sta funzionando bene .. –

18

È possibile alzare la velocità di decelerazione molto alta. Con una velocità infinita, si fermerebbe immediatamente. Prova a impostare il tasso di queste costanti:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal; 

e

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Se veloce ancora non è abbastanza veloce per voi, è solo UIScrollViewDecelerationRateFast typedef'ed come un galleggiante, così puoi semplicemente moltiplicarlo di un fattore di circa 10 per accelerarlo ancora di più.

+0

Grazie per la risposta! Ho provato vari valori per la proprietà decelerationRate, ma non sono riuscito a far apparire la decelerazione non esistente. Un rapido scorrimento fa sempre scorrere la scrollview di una quantità considerevole. –

+9

In base alla mia esperienza, la proprietà 'decelerationRate' risponde solo ai valori esplicati nella documentazione:' UIScrollViewDecelerationRateNormal' e 'UIScrollViewDecelerationRateFast'. –

+0

Questo è quello che stavo cercando. Grazie :) – codeburn

38

Per iOS 5.0 o versioni successive, esiste un metodo migliore rispetto alla chiamata setContentOffset:animated:.

Implementare metodo delegato scrollViewWillEndDragging:withVelocity:targetContentOffset: nel file .m:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset { 
    *targetContentOffset = scrollView.contentOffset; 
} 

Assegnazione l'offset targetContentOffset corrente si ferma la UIScrollView da scorrimento automatico.