style pwa icon home capable bar apps apple app iphone uiscrollview

iphone - pwa - ¿Cómo puedo forzar de forma programada el desplazamiento en un UIScrollView?



web app ipad (9)

Nota: la respuesta dada aquí no funciona para mí.

Tengo un UIScrollView (no una vista de tabla, solo una cosa personalizada), y cuando el usuario realiza ciertas acciones, quiero eliminar cualquier desplazamiento (arrastre o desaceleración) dentro de la vista. He intentado hacer, por ejemplo, esto:

[scrollView scrollRectToVisible:CGRectInset([scrollView bounds], 10, 10) animated:NO];

En la teoría de que, dado que se puede ver un rectángulo, el desplazamiento simplemente se detendrá donde está, pero resulta que esto no tiene ningún efecto. Al parecer, la vista de desplazamiento ve que el rectángulo dado está dentro de los límites. ninguna acción Puedo hacer que el desplazamiento se detenga, si doy un rectángulo que está definitivamente fuera de los límites actualmente visibles, pero dentro del contenido Tamaño de la vista. Esto parece detener la vista como se esperaba ... pero también hace que salte a otra ubicación. Probablemente podría jugar un poco en los márgenes para que esto funcione razonablemente bien, pero ¿alguien sabe de una manera limpia de detener una vista de desplazamiento que está haciendo su trabajo?

Gracias.


Detén el scroll en swift :

scrollView.setContentOffset(scrollView.contentOffset, animated: false)


En realidad ... la forma más "moderna" sería ->

scrollview.panGestureRecognizer.enabled = false; scrollview.panGestureRecognizer.enabled = true;

Esto desactiva el reconocedor de gestos que es responsable del desplazamiento por solo un momento, lo que matará el toque actual. El usuario deberá levantar el dedo y volver a colocarlo para comenzar a desplazarse nuevamente.

Edición: esto solo elimina el arrastre actual del usuario, pero no detiene inmediatamente la desaceleración si la vista de desplazamiento está en este estado actualmente. Para hacer esto, la edición de respuestas aceptadas es prácticamente la mejor manera xD

[scrollview setContentOffset: scrollview.contentOffset animated:false];


Esta respuesta me funcionó: Desactivar UIScrollView desacelerando

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


Esto es lo que hago para mis vistas de desplazamiento y todas las demás subclases relacionadas:

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

Esto establece targetContentOffset en el desplazamiento actual de scrollView , lo que hace que el desplazamiento se detenga porque ha alcanzado el objetivo. En realidad, tiene sentido utilizar un método cuyo propósito es que los usuarios puedan establecer el contentOffset dirigido.

Rápido

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { targetContentOffset.pointee = scrollView.contentOffset }


He intentado estos métodos en collectionview:

self.collectionView.collectionViewLayout.finalizeCollectionViewUpdates()


Jugué con tu solución original un poco, y esto parece funcionar bien. Creo que casi lo tienes, pero simplemente compensaste el rect que usaste demasiado, y olvidaste que solo podías desplazar el rect hacia el original.

La solución generalizada para cualquier acción de desplazamiento es esta:

- (void)killScroll { CGPoint offset = scrollView.contentOffset; offset.x -= 1.0; offset.y -= 1.0; [scrollView setContentOffset:offset animated:NO]; offset.x += 1.0; offset.y += 1.0; [scrollView setContentOffset:offset animated:NO]; }

[Editar] A partir de iOS 4.3 (y posiblemente antes) esto también parece funcionar

- (void)killScroll { CGPoint offset = scrollView.contentOffset; [scrollView setContentOffset:offset animated:NO]; }


La forma más limpia será subclasificar UIScrollView y proporcionar su propio método setContentOffset. Esto debería pasar el mensaje, solo si no ha activado su propiedad booleana de freeze .

Al igual que:

BOOL freeze; // and the @property, @synthesize lines.. -(void)setContentOffset:(CGPoint)offset { if ( !freeze ) [super setContentOffset:offset]; }

Luego, para congelar:

scrollView.freeze = YES;


La respuesta general es que [scrollView setContentOffset:offset animated:NO] no es lo mismo que [scrollView setContentOffset:offset] !

  • [scrollView setContentOffset:offset animated:NO] realidad detiene cualquier animación en ejecución.
  • [scrollView setContentOffset:offset] no detiene ninguna animación en ejecución.
  • Lo mismo para scrollView.contentOffset = offset : no detiene ninguna animación en ejecución.

Eso no está documentado en ninguna parte, pero ese es el comportamiento según lo probado en iOS 6.1 y iOS 7.1, probablemente también antes.

Así que la solución para detener una animación / desaceleración en ejecución es tan simple como eso:

[scrollView setContentOffset:scrollView.contentOffset animated:NO];

Bueno, básicamente lo que dijo David Liu en su respuesta editada. Pero quería dejar claro que estas dos API NO son las mismas.

Swift 3:

scrollView.setContentOffset(scrollView.contentOffset, animated: false)


Para mí, la respuesta aceptada de David Lui no funcionó para mí. Esto es lo que terminé haciendo:

- (void)killScroll { self.scrollView.scrollEnabled = NO; self.scrollView.scrollEnabled = YES; }

Por lo que vale, estoy usando el simulador de iPhone iOS 6.0.