2012-04-06 4 views
4

Ich würde gerne herausfinden, ob ein scrollView nach oben oder unten gescrollt wird. Im Idealfall möchte ich nur einen Anruf haben, wenn die ScrollView nach oben oder unten gescrollt wird. Ich habe versucht, dies aber es wird offensichtlich mir nichts über die Richtung sagen:Wie finde ich heraus, ob scrollView hoch oder runter gescrollt werden soll?

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 
    NSLog(@"%.2f", scrollView.contentOffset.y); 
} 

Content wird immer 0 sein - es spielt keine Rolle, ob ich gescrollt nach oben oder unten. Jetzt konnte ich einfach einchecken - (void) scrollViewDidScroll: wenn der Offset positiv oder negativ ist, wird dieser aber ständig aufgerufen. scrollViewWillBeginDragging hat den Vorteil, dass es nur einmal aufgerufen wird und das ist was ich brauche. Gibt es etwas wie scrollViewDidBeginDragging? Ich habe in den Dokumenten nichts gefunden. Jeder intelligente Workaround?

+1

Was passiert, wenn der Benutzer den Finger nach unten legt, nach unten scrollt, dann seine Meinung ändert und nach oben scrollt? –

+0

@JohnCalsbeek Wenn er <0 scrollt, müsste ich die Aktion abbrechen, die ich beim Scrollen> 0 aufgerufen habe. –

Antwort

2

Erstellen Sie eine deklarierte Eigenschaft, um uns mitzuteilen, dass die Tabellenansicht zu scrollen beginnt. Lassen Sie uns einen BOOL namens scrollViewJustStartedScrolling verwenden.

In scrollViewWillBeginDragging setzen Sie ihn auf true:

self.scrollViewJustStartedScrolling = YES; 

In scrollViewDidScroll wie etwas tun:

if (self.scrollViewJustStartedScrolling) { 
    // check contentOffset and do what you need to do. 
    self.scrollViewJustStartedScrolling = NO; 
} 
12

Shop der Anfangsgehalt Offset in scrollViewWillBeginDragging:

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { 
    self.initialContentOffset = scrollView.contentOffset.y; 
    self.previousContentDelta = 0.f; 
} 

und überprüfen Sie es auf jedem scrollViewDidScroll:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat prevDelta = self.previousContentDelta; 
    CGFloat delta = scrollView.contentOffset.y - self.initialContentOffset; 
    if (delta > 0.f && prevDelta <= 0.f) { 
     // started scrolling positively 
    } else if (delta < 0.f && prevDelta >= 0.f) { 
     // started scrolling negatively 
    } 
    self.previousContentDelta = delta; 
} 
+1

Sie müssen das initialContentOffset nicht speichern, da es immer 0 ist. – lnafziger

+0

Macht Sinn. Ich habe vergessen, dass Benutzer mitten in ihrer Berührung ihre Meinung ändern wollen. Danke vielmals. –

+1

@Inafziger 'contentOffset' ist nicht der Offset vom Anfang des Scrolls, es ist der Offset der gesamten Scroll-Ansicht. Wenn es zu Beginn eines Ziehens immer Null wäre, warum sollten wir uns dann Gedanken darüber machen, ob wir möglicherweise nach oben scrollen können? –

4

Es IS möglich, diese Prüfung in scrollViewWillBeginDragging auszuführen, bevor ein Scrollen registriert ist. (IOS 5+). Durch Überprüfen der integrierten Schwenkgestenerkennung der Bildlaufansicht können Sie die Gestenrichtung überprüfen.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
{ 
    CGPoint translation = [scrollView.panGestureRecognizer translationInView:scrollView.superview]; 

    if(translation.y > 0) 
    { 
     // react to dragging down 
    } else 
    { 
     // react to dragging up 
    } 
} 

Ich fand es bei dem ersten Drag sehr nützlich, aus einer Rolle in Cancelling, wenn der Benutzer in einer verbotenen Richtung schleppt.

+1

** Hinweis, die Übersetzung kann Null zurückgeben, wenn die Geste zu subtil ist. ** Verwenden Sie '' 'CGPoint velocity = [scrollView.panGestureRecognizer velocityInView: scrollView.superview];' '' statt dessen. – Robert

+0

Außerdem, wenn Sie ein UIScrollView streichen und dann berühren und halten, während die Ansicht immer noch verlangsamt, wird scrollViewWillBeginDragging mit Übersetzung und Geschwindigkeit aufgerufen, die beide x = y = 0 haben. Nehmen Sie also besser nicht an, '' 'sonst {...} '' '' '' '' '' Dragging links'''. Überprüfen Sie auf Übersetzungs/Geschwindigkeitswerte von Null, um sicher zu sein. – Robert

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

    if (velocity.y > 0){ 
     NSLog(@"up"); 
    } else { 
     NSLog(@"down"); 
    } 
} 
Verwandte Themen