Можно ли изменить скорость замедления UIScrollView?
Поскольку этот вопрос изначально был задан, настройка пользовательской настройки замедления UIScrollView была добавлена через свойство decelerationRate, представленное в OS 3.0.
У меня есть UIScrollView, скорость замедления которого я бы хотел изменить. Чтобы быть ясным, я говорю о том, когда вы проведите пальцем по виду прокрутки, и вид продолжает прокручиваться (но постепенно замедляется) после того, как вы поднимаете палец. Я хотел бы увеличить скорость замедления, чтобы он скорее прекратился, чем по умолчанию.
Я видел некоторые приложения, где UIScrollViews, похоже, замедляется быстрее. В UIScrollView, похоже, нет API для этого, но мне интересно, есть ли альтернативный способ сделать это.
Ответы
Ответ 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 и переопределить всю обработку касания. Это был бы не мой проект выбора - для его правильной работы потребуется немалая работа.