Cómo bloquear el desplazamiento horizontal de un scrollView en iOS

tengo un scrollView. Quiero que se desplace solo en una dirección (VERTICAL). ¿Hay alguna manera de bloquear el desplazamiento horizontal …? …

La misma respuesta (adaptada) para usted como en:

Desactivar el desplazamiento vertical en UIScrollView

bien, todas las respuestas aquí están bien …

pero si por alguna extraña razón tu contentSize debe ser más alto que UIScrollView en ambas dimensiones, puedes deshabilitar el desplazamiento horizontal implementando el método de protocolo UIScrollView -(void)scrollViewDidScroll:(UIScrollView *)aScrollView

solo agregue esto en su UIViewController

 float oldX; // here or better in .h interface - (void)scrollViewDidScroll:(UIScrollView *)aScrollView { [aScrollView setContentOffset: CGPointMake(oldX, aScrollView.contentOffset.y)]; // or if you are sure you wanna it always on left: // [aScrollView setContentOffset: CGPointMake(0, aScrollView.contentOffset.y)]; } 

es solo el método que se usa cuando el usuario desplaza su UIScrollView , y al hacerlo, fuerza que el contenido tenga siempre el mismo. x

 self.scrollview.contentSize = CGSizeMake(1, self.scrollview.frame.size.height * number_of_items); 

debería ayudar. Acabo de bloquear mi vista de desplazamiento horizontalmente, haciendo una técnica similar.

El método más seguro y exitoso que he encontrado para restringir el movimiento de una vista de desplazamiento es subclase UIScrollView y reemplazar los métodos setContentOffset: animated: y setContentOffset: (código a continuación).

La ventaja de anular estos métodos es que altera directamente el contentOffset solicitado antes de que el código UIKit comience a actuar sobre él, evitando cualquiera de los efectos secundarios que pueden ocurrir al modificar el contentOffset en scrollViewDidScroll: u otros métodos UIScrollViewDelegate .

Solo lleva unos minutos crear la nueva subclase y funciona como un amuleto.

 - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated { // restrict movement to vertical only CGPoint newOffset = CGPointMake(0, contentOffset.y); [super setContentOffset:newOffset animated:animated]; } - (void)setContentOffset:(CGPoint)contentOffset { // restrict movement to vertical only CGPoint newOffset = CGPointMake(0, contentOffset.y); [super setContentOffset:newOffset]; } 

Consulte esta pregunta, debe establecer el tamaño desplazable en el tamaño correspondiente de la vista para que no haya nada que desplazarse.

Si la propiedad contentSize de UIScrollView tiene el mismo ancho que el UIScrollView, entonces no será posible el desplazamiento horizontal.

¿Desea detener el desplazamiento horizontal cuando el desplazamiento horizontal sería válido? (es decir, contentSize es más ancho que el ancho real UIScrollView?) Si ‘sí’, ¿por qué quieres hacer eso?

Puedes probar esto,

 self.ScrollView.contentSize = CGSizeMake(self.ScrollView.frame.size.width, 1450); 

aquí 1450 es mi altura de vista.

ScrollView solo se puede desplazar horizontalmente si configuras el ancho del tamaño del contenido más grande que el marco scrollView. Si configura el ancho del tamaño del contenido al igual que la vista de desplazamiento, no se desplazará. Por ejemplo

UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,100,100)] [scrollView setContentSize:CGSizeMake(100, 300)]

oh, desde iOS7 usa esto (en initWithNibName):

 self.automaticallyAdjustsScrollViewInsets = NO; 

y crea el desplazamiento de página con 3 páginas

 self.pageView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; [self.pageView setContentSize:CGSizeMake(self.view.frame.size.width*3, self.view.frame.size.height)]; [self.pageView setShowsVerticalScrollIndicator:NO]; [self.pageView setPagingEnabled:YES]; [self.view addSubview:self.pageView]; 

En mi caso, contentSize era más alto que UIScrollView para xey. Para mí, la respuesta de meronixe funcionó bastante bien, pero era para mis necesidades no del todo completa. Lamentablemente, la barra de desplazamiento horizontal aún era visible.

Esto podría cambiar con el siguiente código en

 - (void)webViewDidFinishLoad:(UIWebView *)webView [self.webView.scrollView setShowsHorizontalScrollIndicator:NO]; 

Rápido

Hacer contentOffset.x = 0 para deshabilitar desplazamiento horizontal

  extension ViewController: UIScrollViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView) { scrollView.contentOffset.x = 0//to lock horizontal scrolling //scrollView.contentOffset.y = 0//to lock vertical scrolling } } 

Además, puede deshabilitar el indicador de desplazamiento como

  scrollView.showsHorizontalScrollIndicator = false//to disable HorizontalScrollIndicator scrollView.showsVerticalScrollIndicator = false//to disable VerticalScrollIndicator 
Intereting Posts