¿Cómo detener una UIScrollView en un punto específico?

¿Cómo detiene un UIScrollView en un punto específico? Es decir, establecer la position final de UIScrollView después de la interacción del usuario.

Específicamente, ¿cómo se pueden establecer los intervalos a lo largo de una UIScrollView horizontal, de modo que solo se detenga en estos puntos?

Espero que lo que he dicho sea lo suficientemente claro.

Eche un vistazo al método scrollViewWillEndDragging:withVelocity:targetContentOffset: of UIScrollViewDelegate . Está diseñado para hacer exactamente lo que necesita.

La vista de desplazamiento envía este post a su delegado cuando el usuario termina de arrastrar la vista de desplazamiento. El tercer parámetro ( targetContentOffset ) se pasa como un puntero y puede cambiar su valor para cambiar dónde se detendrá la vista de desplazamiento.

iOS 5.0 y posterior.

Tienes 3 opciones:

  1. Puedes hacerlo usando pagingEnabled .
  2. Use setContentOffset: animated: en el UIScrollViewDelegate scrollViewDidEndDecelerating: método
  3. Cree su propia vista de desplazamiento usando touchesBegan , touchesMoved y touchesEnded y extrapola para crear impulso con un punto final apropiado

Encontré algo que me funciona. Te permite desplazarte hasta el punto 0,0 pero no más:

 - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (scrollView.contentOffset.x <= -1) { [scrollView setScrollEnabled:NO]; [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; [scrollView setScrollEnabled:YES]; } } 

Puede hacer lo mismo para arriba, abajo o derecha (x o y)

Para los que tenemos que establecer el targetContentOffset en Swift como Rob Mayoff dice en su excelente respuesta arriba, este es el path:

 func scrollViewWillEndDragging(scrollView: UIScrollView!, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) { targetContentOffset.memory.y = x } 

Esto funcionará bien:

 override func scrollViewDidScroll(scrollView: UIScrollView) { if scrollView.contentOffset.y > CERTAIN_POINT { scrollView.scrollEnabled = false scrollView.scrollEnabled = true } } 

Para lograr esto necesita habilitar la búsqueda del scrollview.

Por ejemplo:

 [scrollView setContentSize:CGSizeMake(640, 161)]; [scrollView setPagingEnabled:YES]; 

aquí, el ancho de scrollview es 640 (el doble de ancho de la pantalla del iphone), si la pagination está habilitada, la dividirá por igual en function del ancho. Así que cuando nos desplazamos a esta position, se detendrá en el desplazamiento particular.

 [scrollView setContentSize:CGSizeMake(640, 161)]; 

Creo que esto puede ayudarlo a verificar esta API provista por Apple

  • (vacío) scrollRectToVisible: (CGRect) rect animado: (BOOL) animado

Y Apple dijo claramente sobre esto. Este método desplaza la vista de contenido para que el área definida por rect sea visible dentro de la vista de desplazamiento. Si el área ya está visible, el método no hace nada.

Para el desplazamiento vertical, uso esto. Funcionaba perfectamente

  • (vacío) scrollViewDidScroll: (UIScrollView *) scrollView {self.scrollView.contentOffset = CGPointMake (0, desinetworkingPoint.y); }