2009-02-04 18 views
20

Dado que esta pregunta se realizó originalmente, la personalización de la tasa de desaceleración UIScrollView se ha agregado a través del decelerationRate property introducido en OS 3.0.¿Se puede modificar la tasa de desaceleración de UIScrollView?


Tengo un UIScrollView cuya tasa de desaceleración que 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.

+0

Ese vínculo es ahora: http://developer.apple.com/library/ios/documentation/UIKit/Reference/ UIScrollView_Class/Reference/UIScrollView.html # // apple_ref/doc/uid/TP40006922-CH3-DontLinkElementID_2 –

+0

Solucionado, gracias. –

Respuesta

0

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.

29

Sí, me han cambiado con éxito la tasa de desaceleración de la siguiente manera:

scrollView.decelerationRate = UIScrollViewDecelerationRateFast; 
+0

desaceleraciónLa velocidad es en realidad un flotante, por lo que puede tener un control más detallado ingresando cualquier valor de flotación. – CharlieMezak

+0

funcionó una delicia, gracias! – Nippysaurus

+4

@CharlieMezak Es un valor flotante, pero solo funciona con los valores UIScrollViewDecelerationRateFast y UIScrollViewDecelerationRateNormal. –

45

Puede utilizar UIScrollView 's decelerationRate propiedad de controlarlo. Aunque su 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); 

Por encima de código da los siguientes resultados, es muy claro que no puedo utilizar la velocidad 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 
+0

He encontrado el mismo comportamiento –

+1

confirmado. esto debe ser un problema de documentación – Marcin

+1

Desafortunadamente es cierto. Me gustaría tener al menos un valor entre estos dos, como 0.994, pero no está funcionando. –

12

He descubierto que mediante el uso de KVC para modificar la variable de instancia _decelerationFactor me ha permitido cambiar la velocidad a algo distinto de UIScrollViewDecelerationRateNormal o UIScrollViewDecelerationRateFast. Me subclases 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; 
} 
+4

Suena como una forma rápida de obtener su aplicación rechazada. –

+5

No he tenido problemas pero está en una zona gris. En eso puede ver la variable directamente en el archivo de encabezado y no necesita volcado de clase. Siento que entra en el ámbito de ir por ello si mejora la experiencia del usuario, pero no dejes que se cierre tu aplicación. – mackross

1

No es un enfoque bastante sencillo. 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 asigne lo que quiere, así por ejemplo:

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