Можно ли изменить скорость замедления UIScrollView? - PullRequest
23 голосов
/ 05 февраля 2009

Поскольку этот вопрос изначально задавался, была добавлена ​​настройка скорости замедления UIScrollView с помощью свойства decelerationRate , представленного в ОС 3.0. У меня есть UIScrollView, скорость замедления которого я бы хотел изменить. Чтобы было ясно, я говорю о том, когда вы проводите пальцем по представлению с прокруткой, и представление продолжает прокручиваться (но постепенно замедляется) после того, как вы поднимаете палец. Я хотел бы увеличить скорость замедления, чтобы она остановилась раньше, чем по умолчанию.

Я видел некоторые приложения, в которых UIScrollViews, кажется, замедляются быстрее. Кажется, в UIScrollView нет API для этого, но мне интересно, есть ли альтернативный способ сделать это.

Ответы [ 5 ]

47 голосов
/ 03 января 2012

Вы можете использовать свойство UIScrollView decelerationRate , чтобы управлять им. Несмотря на то, что он плавает, он не принимает никаких значений, кроме UIScrollViewDecelerationRateNormal или UIScrollViewDecelerationRateFast . Посмотрите на следующий код

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);

Приведенный выше код дает следующие выходные данные, очень ясно, что мы не можем использовать пользовательскую скорость замедления.

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
35 голосов
/ 12 августа 2010

Да, я успешно изменил скорость замедления, выполнив следующие действия:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;
13 голосов
/ 30 июня 2012

Я обнаружил, что с помощью KVC для изменения переменной экземпляра _decelerationFactor позволил мне изменить скорость на значение, отличное от UIScrollViewDecelerationRateNormal или UIScrollViewDecelerationRateFast. Я вложил в подкласс UIScrollView и завернул весь лот в блок try

- (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;
}
1 голос
/ 23 февраля 2015

Существует довольно простой подход. Переопределить метод установки.

@interface UIArbitraryDeceleratingScrollView : UIScrollView

@property(nonatomic,assign) CGFloat decelerationRate;

@end

@implementation UIArbitraryDeceleratingScrollView

@synthesize decelerationRate = _decelerationRate;

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

@end

Теперь назначьте то, что вы хотите, например, так:

_scroller.decelerationRate = (UIScrollViewDecelerationRateNormal+UIScrollViewDecelerationRateFast)/2.1;
0 голосов
/ 05 февраля 2009

Это возможно, но вам придется создать подкласс UIScrollView и переопределить всю обработку касаний. Это не был бы мой проект выбора - потребовалось бы немало усилий, чтобы сделать это правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...