2013-03-06 12 views
7
zwingende

Hier Code meine Überschreibung - es berechnet nur, wo zu schnappen:UIScrollView nicht immer Verzögerung animieren, wenn 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; 
} 

Wenn ich meinen Finger halten für mehr nach unten als eine Sekunde oder zwei, um die Scrollview ziehen und heben Sie dann meinen Finger, es belebt normalerweise in Platz. Allerdings, wenn ich einen schnellen "Flick" mache, animiert es selten - es fängt nur an targetContentOffset. Ich versuche das Standard-Paging-Verhalten zu emulieren (außer das Versuch, benutzerdefinierte Positionen einzufangen).

Irgendwelche Ideen?

Antwort

6

Ich musste es manuell animieren. In der gleichen Funktion setze ich den targetContentOffset auf, wo der Benutzer aufgehört hat (aktueller contentOffset), so dass er nicht seine eigene Animation auslöst, und dann setze ich den contentoffset auf meine Berechnung. Zusätzlich fügte ich eine Geschwindigkeitsprüfung hinzu, um 'automatische' Seitenänderungen auszulösen. Es ist nicht perfekt, aber hoffentlich wird es anderen mit dem gleichen Problem helfen.

(I modifiziert, um die obige Funktion zur besseren Lesbarkeit, da niemand meine Berechnungen sehen muss)

- (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

Ich habe versucht, diese mit einem horizontalen UICollectionView, und während es die resultierende Animation war nervös gearbeitet; Ich denke, es gab zwei Animationen gleichzeitig. Wrapping 'setContentOffset:' in 'dispatch_async' repariert es. – JLundell

+0

Hast du es jemals "perfekt" gemacht? – Lukasz