2013-11-04 13 views
5

ho google e lo cerco ma non ho trovato nulla su internet per risolvere il mio problema ma penso che il mio problema sarà super facile da risolvere ma non riesco a trovare la giusta parola chiave per esso.Funzione di scorrimento automatico per UILabel

Ho un viewcontroller che contiene un testo chiamato ReadingView, una vista che ha un testo molto lungo per poter scorrere per leggere il testo. Quando l'utente andare in ReadingView, sarà Autoscroll fino in fondo da solo, l'utente può aumentare la velocità di scorrimento da UISlider che ho implementato

il problema è che posso fare lo scorrimento automatico senza alcun problema da questo codice

[UIScrollView beginAnimations:@"scrollAnimation" context:nil]; 
[UIScrollView setAnimationDuration:1.0f]; 
[scroll setContentOffset:CGPointMake(x, y)]; 
[UIScrollView commitAnimations]; 

ma il codice aboved è basato sul tempo. Devo trovare un'animazione basata su frame o pixel. Perché il testo è molto lungo se ho usato l'animazione in base al tempo scorrerà verso il basso molto velocemente, mentre il testo breve sarà molto lento.

voi ragazzi avete qualche idea se posso fare animazione come

"Ehi ScrollView, ogni fotogramma si deve spostare verso il basso da 10 pixel fino alla fine del contesto e non mi importa quanto tempo ci vuole, ha risolto la velocità !! "

Grazie per il vostro aiuto, voi ragazzi mi potrebbe aiutare dandomi una parola chiave o qualcosa

UPDATE Fatto da Fogmeister di raccomandare. Il concetto è utilizzare l'animazione del blocco e calcolare il tempo di ogni testo utilizzando time = text length/speed e si otterrà un tempo diverso per ogni testo e si utilizzerà quel tempo per fare animazione. Non ci penso mai ... quello che cerco sempre è la funzione per fare animazione con PIXEL che è una parola chiave sbagliata.

CGFloat scrollingPointSpeed = myslider.value; //value of UI Slider// 
CGFloat time = offset/scrollingPointSpeed ; 
[UIView animateWithDuration:time delay:0.0 options:UIViewAnimationOptionCurveLinear animation:^() 
{ 
self.scroll.contentOffset = CGPointMake(0, offset); 
} 
completion:nil]; 
+0

set setAnimationDuration in base al numero totale di righe in uilabel – NANNAV

+0

Questo metodo di animazione non deve essere utilizzato in iOS 4 o versioni successive. Dovresti usare animazioni basate su blocchi come nella mia risposta. – Fogmeister

risposta

3

OK, in primo luogo, non si dovrebbe essere utilizzando CABasicAnimation. Il metodo migliore è utilizzare le animazioni basate su blocchi.

In secondo luogo, questo dovrebbe essere abbastanza facile.

È possibile calcolare l'offset di una vista di scorrimento massima ...

CGFloat maxOffsetWidth = self.scrollView.contentSize.width - CGRectGetWidth(self.scrollView.frame); 

Questa è la quantità massima di scorrimento che può essere applicato. cioè la distanza.

Ora, per calcolare una durata (tempo) è necessario avere una velocità in mente. Diciamo 50 punti al secondo.

Così ora lascia mettere insieme ...

CGFloat maxOffsetWidth = self.scrollView.contentSize.width - CGRectGetWidth(self.scrollView.frame); 

CGFloat scrollingPointsPerSecond = 50.0; 

CGFloat time = maxOffsetWidth/scrollPointsPerSecond; 

[UIView animateWithDuration:time 
       animations:^() { 
    self.scrollView.contentOffset = CGPointMake(maxOffsetWidth, 0); 
}]; 

Ovviamente, questo è per lo scorrimento orizzontale, se si vuole verticale poi basta utilizzare i diversi valori.

EDIT Breve

La funzione di animazione sopra usa la curva di animazione predefinita che è UIAnimationOptionCurveEaseInOut.Ciò significa che la velocità dello scroll accelera lentamente da 0 all'inizio e quindi rallenta lentamente fino a 0 alla fine.

Quello che probabilmente vorrai è un movimento lineare. cioè la velocità del rotolo è la stessa fino in fondo. Per fare questo è necessaria una funzione leggermente diversa da quella sopra. Aggiunge solo un paio di parametri extra ...

[UIView animateWithDuration:time 
         delay:0.0 
        options:UIViewAnimationOptionCurveLinear 
        animation:^() { 
         self.scrollView.contentOffset = CGPointMake(maxOffsetWidth, 0); 
        } 
       completion:nil]; 

Questo farà esattamente quello che vuoi con un movimento lineare.

+1

Grazie !!! lo proverò domani. e dirà il risultato. – Einzeln

+0

Fantastico !!! grazie. Ho usato il tuo metodo per calcolare l'altezza totale del testo e dividere per velocità di UISlider. So che dovrebbe essere super facile come questo ma così stupido !! haha grazie. – Einzeln

+0

Nessun problema. Mi trovo sempre a pensare troppo ea rendere davvero complicati i problemi veramente semplici. Sono contento di poter aiutare :) – Fogmeister

Problemi correlati