2013-02-15 19 views
6

Mam poziomy UIScrollView. Chcę wykonać wariację animacji "przeciągnij, aby zresetować", w której pociągam całą drogę poza prawą krawędź rozmiaru treści widoku przewijania, puść palec i widok przewijania wraca do (0, 0) Przesunięcie treści.Anuluj UIScrollView bounce po przeciągnięciu

Moja metoda delegat wygląda następująco:

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    //check if it exceeds a certain critical value 
    if (scrollView.contentOffset.x - (scrollView.contentSize.width - IMAGE_WIDTH) > 80) { 
     [self doAnimatedScrollTo:CGPointMake(0, 0)]; 
    } 
} 

gdzie doAnimatedScrollTo: jest zwyczaj metoda animacji konieczne, ponieważ chcę kontrolować czas trwania animacji.

Podczas tej czynności wydaje się, że animacja jest ustawiona w kolejce. Najpierw nastąpi animacja "Odbijanie" UIScrollView, a następnie pojawia się animacja.

Czy istnieje sposób na anulowanie animacji odskoku, utrzymanie przesunięcia treści z "przyciągania" z powrotem, a następnie wykonać moją animację?

+0

Czy próbowałeś odznaczać właściwość odskoku na atrybucie i nspector? – jcesarmobile

+0

@jcesar nope, ponieważ chcę jawnie użyć właściwości Odbijanie. Po prostu nie chcę, aby druga połowa animacji została wykonana - tj. "odbijaj się". – 1actobacillus

+0

Wtedy nie sądzę, że to możliwe. Jeśli używasz odbicia, musisz użyć pełnego odbicia. Może jeśli utworzysz podklasę, możesz zmienić pełną animację – jcesarmobile

Odpowiedz

3

spróbować

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    //check if it exceeds a certain critical value 
    if (scrollView.contentOffset.x - (scrollView.contentSize.width - IMAGE_WIDTH) > 80) { 
    [scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
    } 
} 
2

osiągnąłem anulowanie wraca animację UIScrollView.

Chciałem zostawić domyślne zachowanie podczas szybkiego przewijania do góry, gdy odskakuje. Jednak jeśli przewijanie jest już na górze, a następnie użytkownik ściąga go i zwalnia (analogicznie jak w przypadku odświeżania), chciałem przejąć kontrolę nad odbiciem i zrobić coś niestandardowego.

W Scrollview delegat śledzić pozycję początkową:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.y < 0.1) 
    { 
     isPullingTop = YES; 
    } 
} 

W Scrollview delegata wykryć, czy flaga jest ustawiona i Scrollview jest przeciągany wystarczająco

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
{ 
    if (isPullingTop && scrollView.contentOffset.y < -30) { 

     overrideBounce = YES; 
    } 
    isPullingTop = NO; 
} 

I podklasy Scrollview i zastąpić setContentOffset:

-(void)setContentOffset:(CGPoint)contentOffset 
{ 
    if (!overrideBounce) 
    { 
     [super setContentOffset:contentOffset]; 
    } 
    else 
    { 
     //customs stuff goes here , for example an animation 
     overrideBounce = NO; 
    } 
}