Подтвердить что ты не робот

Можно ли изменить скорость замедления UIScrollView?

Поскольку этот вопрос изначально был задан, настройка пользовательской настройки замедления UIScrollView была добавлена ​​через свойство decelerationRate, представленное в OS 3.0.


У меня есть UIScrollView, скорость замедления которого я бы хотел изменить. Чтобы быть ясным, я говорю о том, когда вы проведите пальцем по виду прокрутки, и вид продолжает прокручиваться (но постепенно замедляется) после того, как вы поднимаете палец. Я хотел бы увеличить скорость замедления, чтобы он скорее прекратился, чем по умолчанию.

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

4b9b3361

Ответ 1

Вы можете использовать свойство UIScrollView decelerationRate, чтобы управлять им. Даже несмотря на то, что его float не принимает никаких значений, кроме 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

Ответ 2

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

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

Ответ 3

Я обнаружил, что с помощью 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;
}

Ответ 4

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

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

Ответ 5

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