Desactivar la desaceleración de UIScrollView


¿Hay alguna forma de desactivar la desaceleración de un UIScrollView?

Quiero permitir que el usuario desplace el lienzo, pero no quiero que el lienzo continúe desplazándose después de que el usuario levante el dedo.

Author: Markus Müller, 2009-07-09

5 answers

Esto se puede hacer utilizando el método delegado UIScrollView scrollViewWillBeginDecelerating para establecer automáticamente el desplazamiento de contenido a la posición actual de la pantalla.

Para implementar:

  1. Asigne un delegado a su objeto UIScrollView si aún no lo ha hecho.
  2. En el archivo de implementación de su delegado .m, agregue las siguientes líneas de código:

    -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{  
        [scrollView setContentOffset:scrollView.contentOffset animated:YES];   
    }
    

Voila! No más desplazamiento automático.

 62
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-21 20:42:22

Para iOS 5.0 o posterior, hay un método mejor que llamar a setContentOffset:animated:.

Implementa el método delegado scrollViewWillEndDragging:withVelocity:targetContentOffset: en tu archivo .m:

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
                     withVelocity:(CGPoint)velocity
              targetContentOffset:(inout CGPoint *)targetContentOffset {
    *targetContentOffset = scrollView.contentOffset;
}

Asignar el desplazamiento actual a targetContentOffset detiene el desplazamiento automático de UIScrollView.

 38
Author: Quotation,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-13 19:28:03

Puede subir la tasa de desaceleración muy alto. Con una tasa infinita, se detendría inmediatamente. Intente establecer la velocidad a estas constantes:

scrollView.decelerationRate = UIScrollViewDecelerationRateNormal;

Y

scrollView.decelerationRate = UIScrollViewDecelerationRateFast;

Si rápido todavía no es lo suficientemente rápido para usted, UIScrollViewDecelerationRateFast es solo typedef'ed como un flotador, por lo que solo puede multiplicarlo por un factor de 10 o así para acelerarlo aún más.

 19
Author: Dan Lorenc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-09 18:22:04

Simplemente establezca la propiedad decelerationRate en 0

Desactivará la propiedad de desplazamiento automático. Pero tenga en cuenta que la interacción del usuario se volverá mala si scrollview contentsize es grande.

 1
Author: Emtiyaj Ali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 07:15:47

Se usa debajo del código para desacelerar el desplazamiento en CollectionView en Swift 4:

self.collectionView.decelerationRate = .leastNormalMagnitude
 0
Author: Amit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-06 10:29:44