Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can UIScrollView's deceleration rate be modified?

Tags:

cocoa-touch

Since this question was originally asked, UIScrollView deceleration rate customization has been added via the decelerationRate property introduced in OS 3.0.


I have a UIScrollView whose deceleration rate I'd like to change. To be clear, I'm talking about when you swipe your finger on a scroll view and the view continues to scroll (but gradually slows) after you lift your finger. I'd like to increase the deceleration rate so that it stops sooner that it does by default.

I've seen some apps where the UIScrollViews seem to decelerate more quickly. There seems to be no API for this in UIScrollView, but I'm wondering if there's an alternative way to do it.

like image 832
Mike McMaster Avatar asked Feb 04 '09 21:02

Mike McMaster


4 Answers

You can use UIScrollView's decelerationRate property to control it. Even though its float, its not accepting any value other than UIScrollViewDecelerationRateNormal or UIScrollViewDecelerationRateFast . Look at the following 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 gives the following outputs, its very clear we cant not use custom deceleration rate.

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
like image 159
Anto Binish Kaspar Avatar answered Nov 20 '22 23:11

Anto Binish Kaspar


Yes, I have successfully changed the deceleration rate by doing the following:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
like image 36
yeahdixon Avatar answered Nov 20 '22 23:11

yeahdixon


I found that by using KVC to modify the instance variable _decelerationFactor allowed me to change the rate to something other than UIScrollViewDecelerationRateNormal or UIScrollViewDecelerationRateFast. I subclassed UIScrollView and wrapped the whole lot in a 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;
}
like image 38
mackross Avatar answered Nov 20 '22 21:11

mackross


There is a pretty straightforward approach. Override the setter method.

@interface UIArbitraryDeceleratingScrollView : UIScrollView

@property(nonatomic,assign) CGFloat decelerationRate;

@end

@implementation UIArbitraryDeceleratingScrollView

@synthesize decelerationRate = _decelerationRate;

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

@end

Now assign what you want to, like this for example:

_scroller.decelerationRate = (UIScrollViewDecelerationRateNormal+UIScrollViewDecelerationRateFast)/2.1;
like image 44
Dmitry Demenchoock Avatar answered Nov 20 '22 22:11

Dmitry Demenchoock