tutorial cocoa-touch

cocoa-touch - cocoa touch tutorial



¿Se puede modificar la tasa de desaceleración de UIScrollView? (5)

Dado que originalmente se planteó esta pregunta, se ha agregado la personalización de la tasa de desaceleración UIScrollView a través de la propiedad decelerationRate introducida en OS 3.0.

Tengo un UIScrollView cuya velocidad de desaceleración me gustaría cambiar. Para que quede claro, estoy hablando de cuando deslizas el dedo en una vista de desplazamiento y la vista continúa desplazándose (pero se ralentiza gradualmente) después de levantar el dedo. Me gustaría aumentar la tasa de desaceleración para que se detenga antes de que lo haga de manera predeterminada.

He visto algunas aplicaciones donde los UIScrollViews parecen desacelerarse más rápidamente. Parece que no hay API para esto en UIScrollView, pero me pregunto si existe una forma alternativa de hacerlo.


Esto es posible, pero tendría que subclase UIScrollView y anular todo el manejo táctil. No sería mi proyecto de elección, tomaría un buen trabajo para hacerlo bien.


Puede usar la propiedad decelerationRate de UIScrollView para controlarlo. A pesar de que es flotante, no acepta ningún otro valor que no sea UIScrollViewDecelerationRateNormal o UIScrollViewDecelerationRateFast . Mira el siguiente código

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

El código anterior proporciona las siguientes salidas, es muy claro que no podemos usar una tasa de desaceleración personalizada.

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


Hay un enfoque bastante directo. Anular el método 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

Ahora asigna lo que quieras, como este, por ejemplo:

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


Sí, he cambiado con éxito la tasa de desaceleración haciendo lo siguiente:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;


Descubrí que al usar KVC para modificar la variable de instancia, _decelerationFactor me permitió cambiar la velocidad a algo que no sea UIScrollViewDecelerationRateNormal o UIScrollViewDecelerationRateFast . Subclassed UIScrollView y envolví todo el lote en un bloque 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; }