2009-07-09 4 views
32

Gibt es eine Möglichkeit, das Abbremsen eines UIScrollView zu deaktivieren?UIScrollView decelerating deaktivieren

Ich möchte dem Benutzer ermöglichen, die Leinwand zu scrollen, aber ich möchte nicht, dass die Leinwand weiter scrollt, nachdem der Benutzer den Finger hob.

+1

Warum würden Sie das tun? –

+5

Adam, Ich bin mir bewusst, dass das Ändern des Standardverhaltens nicht empfohlen wird, aber ich denke, in meinem speziellen Fall würde es Sinn machen. Ich implementiere eine erweiterte Leinwand mit der Möglichkeit, Objekte direkt auf der Leinwand zu bearbeiten. Wenn ich diesen On-Canvas-Bearbeitungsmodus betrete, möchte ich die Entfernung beschränken, die der Benutzer scrollt, so dass das Objekt immer im sichtbaren Bereich ist. Der Benutzer darf weiter scrollen, aber er würde auf den Finger zurückspringen. Ich bin mir der contentSize-Eigenschaft bewusst, aber sie stört meine wachsende Leinwand. –

+2

In meiner Situation bezahlten wir für Mietarbeit und der Kunde verlangte, dass wir die Verzögerungsbewegung entfernen. – Mark

Antwort

60

Dies kann unter Verwendung der Delegiertenmethode UIScrollViewscrollViewWillBeginDecelerating erfolgen, um den Inhaltsversatz automatisch auf die aktuelle Bildschirmposition festzulegen.

implementieren:

  1. einen Delegierten zu Ihrem UIScrollView Objekt zuweisen, wenn Sie nicht bereits getan haben.
  2. In Ihrer .m Implementierungsdatei der Stellvertretung, fügen Sie die folgenden Codezeilen:

    -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{ 
        [scrollView setContentOffset:scrollView.contentOffset animated:YES]; 
    } 
    

Voila! Kein automatischer Bildlauf mehr

+1

Schön. Ich habe keine Ahnung warum, aber es funktioniert. Vielen Dank! –

+0

Mine springt dorthin, wo die Verlangsamung zurück wäre, wo sie angefangen hat ... Irgendwelche Vorschläge? – jjxtra

+0

Es funktioniert gut .. –

18

Sie können die Verzögerungsrate sehr hoch einstellen. Mit einer unendlichen Rate würde es sofort aufhören. Versuchen Sie, die Rate auf diese Konstanten:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal; 

und

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 

Wenn schnell noch nicht schnell genug für Sie ist, ist UIScrollViewDecelerationRateFast nur als Schwimmer typedef, so dass Sie es nur vermehren um den Faktor 10 oder so, um es noch mehr zu beschleunigen.

+0

Vielen Dank für Ihre Antwort! Ich habe verschiedene Werte für die Eigenschaft 'holdingRate' ausprobiert, aber es ist mir nicht gelungen, die Verzögerung als nicht vorhanden erscheinen zu lassen. Ein schneller Wischvorgang bewirkt immer, dass die Bildlaufansicht eine beträchtliche Menge scrollt. –

+9

Meiner Erfahrung nach reagiert die Eigenschaft 'breakershipRate' nur auf die in der Dokumentation explizierten Werte:' UIScrollViewDecelerationRateNormal' und 'UIScrollViewDecelerationRateFast'. –

+0

Das ist, was ich gesucht habe. Danke :) – codeburn

38

Für iOS 5.0 oder höher gibt es eine bessere Methode als den Aufruf setContentOffset:animated:.

Implementieren Delegatmethode scrollViewWillEndDragging:withVelocity:targetContentOffset: in Ihrer .m Datei:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 
        withVelocity:(CGPoint)velocity 
       targetContentOffset:(inout CGPoint *)targetContentOffset { 
    *targetContentOffset = scrollView.contentOffset; 
} 

den Strom zu targetContentOffset Offset zuweisen stoppt den UIScrollView von Auto-Scrollen.