2013-03-06 10 views
7

Ecco il mio codice di override - calcola solo dove snap:UIScrollView non sempre animare decelerazione quando si esegue l'override scrollViewWillEndDragging

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

    if(targetContentOffset->y < 400) { 
     targetContentOffset->y = 0; 
     return; 
    } 

    int baseCheck = 400; 

    while(baseCheck <= 10000) { 
     if(targetContentOffset->y > baseCheck && targetContentOffset->y < baseCheck + 800) { 
      targetContentOffset->y = (baseCheck + 340); 
      return; 
     } 
     baseCheck += 800; 
    } 

    targetContentOffset->y = 0; 
} 

Quando tengo il dito verso il basso per più di un secondo o due per trascinare lo ScrollView e poi alza il dito, di solito si anima al suo posto. Tuttavia, quando eseguo uno "sfogliamento" veloce, si anima raramente, ma si aggancia a targetContentOffset. Sto cercando di emulare il comportamento di paging predefinito (tranne il tentativo di eseguire lo snap alle posizioni personalizzate).

Qualche idea?

risposta

6

Ho finito per dover animare manualmente. Nella stessa funzione, ho impostato il targetContentOffset nel punto in cui l'utente era stato interrotto (current contentOffset) in modo che non attivasse la propria animazione, quindi ho impostato il contentoffset sul mio calcolo. Inoltre, ho aggiunto un controllo della velocità per attivare i cambi di pagina automatici. Non è perfetto, ma speriamo che aiuti gli altri con lo stesso problema.

(I modifica la funzione di cui sopra per migliorare la leggibilità poiché nessuno deve vedere i miei calcoli)

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

    CGPoint newOffset = CGPointMake(targetContentOffset->x, targetContentOffset->y); 
    *targetContentOffset = CGPointMake([broadsheetCollectionView contentOffset].x, [broadsheetCollectionView contentOffset].y); 

    if(velocity.y > 1.4) { 
     newOffset.y += pixelAmountThatWillMakeSurePageChanges; 
    } 
    if(velocity.y < -1.4) { 
     newOffset.y -= pixelAmountThatWillMakeSurePageChanges; 
    } 

    // calculate newoffset 

    newOffset.y = calculatedOffset; 
    [scrollView setContentOffset:newOffset animated:YES]; 
} 
+5

Ho provato questo con un UICollectionView orizzontale, e mentre ha funzionato, l'animazione risultante è stato agitato; Penso che ci fossero due animazioni in corso allo stesso tempo. Wrapping 'setContentOffset:' in 'dispatch_async' risolto. – JLundell

+0

Hai mai fatto il modo 'perfetto'? – Lukasz

Problemi correlati