2009-02-04 14 views
20

Da diese Frage ursprünglich gestellt wurde, wurde die Anpassung der UIScrollView-Verzögerungsrate über die in OS 3.0 eingeführte decelerationRate property hinzugefügt.Kann die Verzögerungsrate von UIScrollView geändert werden?


Ich habe eine UIScrollView, deren Verzögerungsrate würde ich gerne ändern. Um es klar zu sagen, ich spreche davon, wenn Sie mit Ihrem Finger über eine Bildlaufansicht wischen und die Ansicht weiter scrollt (aber allmählich langsamer wird), nachdem Sie Ihren Finger gehoben haben. Ich möchte die Verzögerungsrate erhöhen, so dass es früher als standardmäßig stoppt.

Ich habe einige Apps gesehen, wo die UIScrollViews schneller abzubremsen scheinen. Es scheint keine API dafür in UIScrollView zu geben, aber ich frage mich, ob es einen alternativen Weg dafür gibt.

+0

Diese Verbindung ist jetzt: http://developer.apple.com/library/ios/documentation/UIKit/Reference/ UIScrollView_Class/Referenz/UIScrollView.html # // apple_ref/doc/uid/TP40006922-CH3-DontLinkElementID_2 –

+0

Fixed - danke. –

Antwort

0

Dies ist möglich, aber Sie müssten UIScrollView ableiten und die gesamte Touch-Behandlung außer Kraft setzen. Es wäre nicht mein Projekt der Wahl - es würde ein gutes Stück Arbeit benötigen, um es richtig zu machen.

29

Ja, habe ich erfolgreich die Verzögerungsrate, indem Sie folgende geändert:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

decelerationRate ist eigentlich ein Gleitkomma, so dass Sie eine detailliertere Kontrolle haben können, indem Sie einen Gleitkommawert eingeben. – CharlieMezak

+0

hat ein Vergnügen gemacht, danke! – Nippysaurus

+4

@CharlieMezak Es ist ein Float, aber funktioniert nur mit den Werten UIScrollViewDecelerationRateFast und UIScrollViewDecelerationRateNormal. –

45

Sie können UIScrollView ‚s decelerationRate Eigenschaft, es zu kontrollieren. Obwohl sein Float keinen anderen Wert akzeptiert als UIScrollViewDecelerationRateNormal oder UIScrollViewDecelerationRateFast. Schauen Sie sich den folgenden Code

NSLog(@"1. decelerationRate %f", scrollview.decelerationRate); 

scrollview.decelerationRate = UIScrollViewDecelerationRateNormal; 
NSLog(@"2. decelerationRate %f", scrollview.decelerationRate); 

scrollview.decelerationRate = UIScrollViewDecelerationRateFast; 
NSLog(@"3. decelerationRate %f", scrollview.decelerationRate); 

scrollview.decelerationRate = 0.7; 
NSLog(@"4. decelerationRate %f", scrollview.decelerationRate); 

scrollview.decelerationRate = 0.995; 
NSLog(@"5. decelerationRate %f", scrollview.decelerationRate); 

Above Code gibt die folgenden Ausgaben, die sehr klar, dass wir kippen keine benutzerdefinierte Verzögerungsrate verwenden.

2012-01-03 11:59:41.164 testviewv2[10023:707] 1. decelerationRate 0.998000 
2012-01-03 11:59:41.172 testviewv2[10023:707] 2. decelerationRate 0.998000 
2012-01-03 11:59:41.173 testviewv2[10023:707] 3. decelerationRate 0.990000 
2012-01-03 11:59:41.175 testviewv2[10023:707] 4. decelerationRate 0.990000 
2012-01-03 11:59:41.176 testviewv2[10023:707] 5. decelerationRate 0.998000 
+0

Ich habe das gleiche Verhalten –

+1

bestätigt gefunden. Dies muss Dokumentationsausgabe sein – Marcin

+1

Leider ist es wahr. Ich möchte mindestens einen Wert zwischen diesen beiden haben, wie 0.994, aber es funktioniert nicht. –

12

fand ich, dass KVC unter Verwendung der Instanzvariable _decelerationFactor erlaubt zu ändern mir die Rate auf etwas anderes als UIScrollViewDecelerationRateNormal oder UIScrollViewDecelerationRateFast zu ändern. Ich subclassed UIScrollView und wickelte die ganze Menge in einem try-Block

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
     @try { 
      CGFloat decelerationRate = UIScrollViewDecelerationRateFast +(UIScrollViewDecelerationRateNormal - UIScrollViewDecelerationRateFast) * .52; 
      [self setValue:[NSValue valueWithCGSize:CGSizeMake(decelerationRate,decelerationRate)] forKey:@"_decelerationFactor"]; 

     } 
     @catch (NSException *exception) { 
      // if they modify the way it works under us. 
     } 


    } 
    return self; 
} 
+4

Klingt nach einem schnellen Weg, um Ihre App abzulehnen. –

+5

Ich hatte keine Probleme damit, aber es ist in einer kleinen Grauzone. In diesem können Sie die Variable direkt in der Header-Datei sehen und brauchen nicht Class Dump. Ich denke, es fällt in den Bereich der Besserung, wenn es die User Experience verbessert, aber lass es deine App nicht zum Absturz bringen. – mackross

1

Es ist ein ziemlich einfacher Ansatz. Überschreiben Sie die Setter-Methode.

@interface UIArbitraryDeceleratingScrollView : UIScrollView 

@property(nonatomic,assign) CGFloat decelerationRate; 

@end 

@implementation UIArbitraryDeceleratingScrollView 

@synthesize decelerationRate = _decelerationRate; 

- (void)setDecelerationRate:(CGFloat)dr 
{ 
    [super setDecelerationRate:dr]; 
    _decelerationRate = dr; 
} 

@end 

Jetzt zuweisen, was Sie wollen, wie dies zum Beispiel,:

_scroller.decelerationRate = (UIScrollViewDecelerationRateNormal+UIScrollViewDecelerationRateFast)/2.1; 
Verwandte Themen