2012-01-25 23 views
9

Come si ferma un UIScrollView in un punto specifico? Cioè, imposta la posizione finale del UIScrollView dopo l'interazione dell'utente?Come fermare un UIScrollView in un punto specifico?

In particolare, come è possibile impostare gli intervalli lungo uno orizzontale UIScrollView, in modo che si fermi solo in questi punti?

Spero che quello che ho detto sia abbastanza chiaro.

+0

Si noti che il modo "straordinariamente semplice" per farlo è, basta rendere la vista di scorrimento ampia solo come ogni "unità" - e impostare il paging. Hai finito. Si noti che è bene avere il "resto della visualizzazione di scorrimento" "appeso fuori i lati" della visualizzazione di scorrimento "reale". Devi manipolare attentamente l'area tangibile se necessario. – Fattie

+0

@JoeBlow che risolve il problema per alcuni sono sicuro, ma non risponde alla domanda. Volevo essere in grado di impostare la posizione di scorrimento su * qualsiasi * punto specifico ... il paging non è la risposta qui. –

+0

Hey Jesse - con tutti i mezzi. Stavo solo indicando il modo "super semplice" per raggiungere questo obiettivo, che in genere è possibile utilizzare! – Fattie

risposta

31

Dai un'occhiata al metodo scrollViewWillEndDragging:withVelocity:targetContentOffset: di UIScrollViewDelegate. Ha lo scopo di fare esattamente quello che ti serve.

La visualizzazione di scorrimento invia questo messaggio al suo delegato quando l'utente termina il trascinamento della vista di scorrimento. Il terzo parametro (targetContentOffset) viene passato come puntatore e puoi modificarne il valore per cambiare dove si fermerà la visualizzazione di scorrimento.

iOS 5.0 e versioni successive.

+0

Sì, amico, è davvero bello. Funziona perfettamente, infatti. –

+0

@JesseHead Quindi qual è stata la tua risposta finale? –

+0

nota che in molti casi utilizzerai anche 'scrollViewDidScroll' - così che il valore cambierà man mano che l'utente tiene e sposta il cursore. – Fattie

1

per raggiungere questo u necessità di consentire il paging della ScrollView

Ad esempio:

[scrollView setContentSize:CGSizeMake(640, 161)]; 
[scrollView setPagingEnabled:YES]; 

qui, larghezza ScrollView è 640 (il doppio della larghezza dello schermo iphone), se il paging è attivato lo dividerà equamente in base alla larghezza. Quindi, mentre scorriamo in questa posizione, si fermerà al particolare offset.

+0

sì ... l'ho guardato in origine, ma voglio permettere che il mio contenuto si fermi in un numero qualsiasi di posizioni dopo uno swipe. il paging consente solo una distanza impostata da spostare per scorrimento (in questo caso credo che siano 320 pixel?). questo è difficile da spiegare ... se guardi l'app di notizie gratuite chiamata "impulso", mostra ciò che sto cercando. –

+0

in realtà se la dimensione del contenuto di scrollview è più delle dimensioni dello schermo, l'utente può impostare la posizione fissa come scroll horiz/vert ... vuoi farlo per codice ..? – vishy

+0

sì codice sarebbe fantastico. –

11

hai 3 opzioni:

  1. È possibile farlo utilizzando pagingEnabled.

  2. Usa setContentOffset: animated: nel metodo UIScrollViewDelegatescrollViewDidEndDecelerating:

  3. Crea il tuo vista di scorrimento utilizzando touchesBegan, touchesMoved e touchesEnded ed estrapolare per creare slancio con un endpoint appropriata
+0

Finalmente qualcuno sta iniziando a capire cosa sto cercando lol. il numero 2 sembra piuttosto attraente. vedrà come funziona –

+0

Sapresti come rilevare la posizione corrente della scrollview come scrollViewDidEndDecelerating: il metodo viene attivato? –

+1

La posizione corrente è memorizzata nella proprietà 'contentOffset' (CGPoint) – basvk

0
[scrollView setContentSize:CGSizeMake(640, 161)]; 
0

Penso che questo possa aiutatemi a controllare questa API fornita da apple

  • (void) scrollRectToVisible: (CGRect) rect animata: (BOOL) animato

e Apple chiaramente detto su questo Questo metodo scorre il punto di vista dei contenuti in modo che l'area definita dal rect è appena visibile all'interno del rotolo vista. Se l'area è già visibile, il metodo non fa nulla.

0

Per lo scorrimento verticale lo uso. Ha funzionato perfettamente

  • (void) scrollViewDidScroll: (UIScrollView *) ScrollView { self.scrollView.contentOffset = CGPointMake (0, desiredPoint.y); }
4

Ho trovato qualcosa che funziona per me.E ti permette di scorrere al punto 0,0 ma non oltre:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.x <= -1) { 
     [scrollView setScrollEnabled:NO]; 
     [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
     [scrollView setScrollEnabled:YES]; 
    } 
} 

Si potrebbe fare lo stesso per la parte superiore, in basso oa destra (X o Y)

+0

Mi ha aiutato tantissimo! –

+0

questa è la risposta giusta –

2

Per coloro che abbiamo bisogno di impostare la targetContentOffset a Swift come Rob mayoff dice nel suo eccellente risposta di cui sopra, questo è il modo:

func scrollViewWillEndDragging(scrollView: UIScrollView!, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { 
    targetContentOffset.memory.y = x 
} 
2

questo funziona bene:

override func scrollViewDidScroll(scrollView: UIScrollView) { 
    if scrollView.contentOffset.y > CERTAIN_POINT { 
     scrollView.scrollEnabled = false 
     scrollView.scrollEnabled = true 
    } 
} 
Problemi correlati