2013-03-06 22 views
7

Tu jest mój kod obejścia - to właśnie wylicza gdzie przystawki do:UIScrollView nie zawsze animować wyhamowanie gdy nadrzędne 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; 
} 

Kiedy trzymam palec w dół o ponad sekundę lub dwie, aby przeciągnąć Scrollview a następnie podnieś palec, zwykle animuje się na swoim miejscu. Jednak gdy wykonuję szybki "ruch", rzadko animuje się - po prostu przyciąga do obiektu docelowegoContentOffset. Próbuję emulować domyślne zachowanie stronicowania (z wyjątkiem próby przyciągnięcia do niestandardowych pozycji).

Wszelkie pomysły?

Odpowiedz

6

Skończyło się na tym, że musiałem ręcznie ożywić. W tej samej funkcji ustawię obiekt docelowyContentOffset na miejsce, w którym użytkownik przerwał (bieżący contentOffset), tak aby nie uruchamiał własnej animacji, a następnie ustawiłem offset zawartości na moje obliczenia. Dodatkowo dodałem w kontroli prędkości, aby wywołać "automatyczne" zmiany strony. Nie jest doskonały, ale mam nadzieję, że pomoże innym z tym samym problemem.

(I zmodyfikowano powyższą funkcję dla czytelności, ponieważ nikt nie potrzebuje, aby zobaczyć moich obliczeń)

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

Próbowałem to z poziomym UICollectionView, a jednocześnie pracował, uzyskany animacja był roztrzęsiony; Myślę, że w tym samym czasie miały miejsce dwie animacje. Zawijanie 'setContentOffset:' w 'dispatch_async' naprawiło to. – JLundell

+0

Czy kiedykolwiek zrobiłeś to "perfekcyjnie"? – Lukasz