2012-06-04 15 views
26

Sto provando ad implementare una barra delle schede personalizzata che è scorrevole e ha il paging ad ogni elemento della barra delle schede. Per quello sto usando il delegato scrollViewWillEndDragging: withVelocity: targetContentOffset: che funziona perfettamente con un problema.scrollViewWillEndDragging: withVelocity: targetContentOffset: non funziona ai bordi di UISCrollView

Il modo in cui il mio paging funziona è, se il contentOffset si trova vicino al punto giusto, il targetContentOffset modifiche alla compensazione di tale elemento. Stessa cosa per il lato sinistro.

Il problema è che ogni volta che mi trovo a metà sinistra del primo elemento e a destra dell'ultimo (la vista di scorrimento funziona in orizzontale), è necessario passare a ContentOffset 0 e allo spostamento contenuto dell'elemento più a destra (meno quelli sullo schermo), ma non è così.

Ho controllato con il debugger e il targetContentOffset-> x è infatti 0 (nel primo caso - sinistra della voce più a sinistra). Quindi il problema è che UIScrollView non sta scorrendo lì. Mi sono perso.

Ecco il mio delegato implementato:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
       withVelocity:(CGPoint)velocity 
      targetContentOffset:(inout CGPoint *)targetContentOffset{ 
    NSInteger index = lrintf(targetContentOffset->x/self.tabWidth); 
    targetContentOffset->x = index * self.tabWidth; 
} 

Ecco lo schema che spiega quello che voglio fare.

|-------|-------|-------|-------|-------|-------|-------| 
|  |  |  |  |  |  |  | 
|  |  |  |  |  |  |  | 
|_______|_______|_______|_______|_______|_______|_______| 

     |_______________________________________| 
     where it is and i scroll it to the left 

    <----| 

    |_______________________________________| 
       where it would stop 

|_______________________________________| 
     where i want it to stop 

risposta

14

Questo è un problema noto a quanto pare. Dopo alcune indagini e parlando con altre persone è stato suggerito che potrebbe essere un bug, che si è rivelato essere corretto. L'ho segnalato ad Apple ed è stato contrassegnato come duplicato ma è ancora aperto. Sto solo rispondendo per quelli di voi con lo stesso problema. Ho risolto il problema come suggerisce Big Papoo, utilizzando un offset vicino a quello che voglio (0,1 sembra farlo). Lo stesso per l'estremità giusta.

+0

Ho riscontrato anche questo problema. Qualche possibilità di pubblicare il numero ID bug di Apple - o meglio, un link alla voce OpenRadar - per aiutare me stesso, e possibilmente gli altri, a pubblicare un bug report duplicato? (È abbastanza noto che Apple dà la priorità alla risoluzione dei bug in base al numero di rapporti che ricevono). – Calrion

+0

Sicuro. È un duplicato di 10255505 ma sembra che non esista in OpenRadar. Ad ogni modo sembra essere chiuso ora, ma non so se rilasceranno la correzione o meno. – dvieira

3

ho trovato 2 comportamenti irregolari che si possono indagare: - azzeramento come offset finale non funziona, vi suggerisco di mettere 1 o qualcosa maggiore di zero (0.5 può funzionare, non testato) - È meglio controllare il segno di velocità e calcolare l'offset finale sul lato sinistro o destro del punto corrente in cui l'utente rimosso è un dito. Non cercare di far andare indietro lo scorrimento dall'altra parte.

+0

Grazie mille per la risposta. Hai ragione. Anch'io ho investigato e parlato con altre persone e ho scoperto che era un insetto. Ho semplicemente dimenticato di rispondere alla mia domanda, mi dispiace (se vuoi maggiori dettagli, per favore guarda qui). Un offset come 0.1 sembra farlo. Comunque, grazie mille. – dvieira

0

Se stai usando una vista tavola orizzontale, poi dentro il vostro scrollViewWillEndDragging: withVelocity: targetContentOffset: la funzione, è possibile chiamare:

[self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:<index> inSection:<section>] atScrollPosition:UITableViewScrollPositionTop animated:YES]; 

ho trovato questo a lavorare molto meglio che cercare di manipolare targetContentOffset-> y in una vista tabella orizzontale.

8

ho provato a fissare la finale di offset a qualcosa di un po 'fuori da zero o la dimensione dei contenuti, come suggerito da Big Papoo ma ho notato che questo rimuove il rimbalzo over-scroll. La mia soluzione a questo è stato quello di verificare l'targetContentOffset originale per vedere se è uguale a zero o contentSize e lasciandola se è:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 

    float expectedOffset = targetContentOffset->x; 
    if (expectedOffset == 0 || expectedOffset == scrollView.contentSize.width) return; // Scroll view will bounce so leave the targetContentOffset. 

    float targetOffset = [self roundedOffset:expectedOffset]; // Round your offset. 

    // Adjust the offset to make sure it works. 
    if (targetOffset == 0) targetOffset = 1; 
    else if (targetOffset == SCROLLVIEW_WIDTH) targetOffset = SCROLLVIEW_WIDTH - 1; 

    targetContentOffset->x = targetOffset; 
} 

Ovviamente si può quindi utilizzare scrollViewDidEndDecelerating: per spostare lo ScrollView che 1 punto .

8

Risolto il problema su iOS 6.0.

ora funziona come dovrebbe.

Problemi correlati