Tengo un UIView
trampolín como el del iPhone. Lo he creado usando un UIScrollView
y UIButtons
. Quiero deshabilitar el desplazamiento horizontal en dicha vista de desplazamiento. Solo quiero desplazamiento vertical. ¿Cómo logro esto?
Tengo un UIView
trampolín como el del iPhone. Lo he creado usando un UIScrollView
y UIButtons
. Quiero deshabilitar el desplazamiento horizontal en dicha vista de desplazamiento. Solo quiero desplazamiento vertical. ¿Cómo logro esto?
Respuestas:
Tienes que establecer la contentSize
propiedad del UIScrollView
. Por ejemplo, si UIScrollView
tiene 320 píxeles de ancho (el ancho de la pantalla), puede hacer esto:
CGSize scrollableSize = CGSizeMake(320, myScrollableHeight);
[myScrollView setContentSize:scrollableSize];
La UIScrollView
continuación, sólo desplazarse verticalmente, debido a que ya puede mostrar todo horizontalmente.
ACTUALIZADO: (Después de que @EranMarom señaló en su comentario)
Puede detener el desplazamiento horizontal o vertical en el ScrollViewDelegate
Método. Aquí es como
Detiene el desplazamiento horizontal:
Si desea desplazarse horizontalmente, debe aumentar el contentOffset.x. Evitar eso detiene el desplazamiento de la vista de desplazamiento en dirección horizontal.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.x = 0.0
}
Detiene el desplazamiento vertical:
Si desea desplazarse verticalmente, debe aumentar el contentOffset.y. Evitar eso detiene el desplazamiento de la vista de desplazamiento en dirección vertical.
- (void)scrollViewDidScroll:(UIScrollView *)sender {
sender.contentOffset.y = 0.0
}
El código anterior evita los cambios en x
y y
de a scrollview contentOffset
y conduce a detener el scrollViewDidScroll:
método de desplazamiento .
scrollView.contentOffset = CGPointMake(0, scrollView.contentOffset.y);
para deshabilitar el desplazamiento horizontal. Lo encuentro más legible, es más pequeño y no tiene sentido hacer la prueba para cero porque prácticamente no hay sobrecarga con el código que se ejecuta con esta poca frecuencia (es decir, unas pocas decenas de veces por segundo como máximo).
scrollView.contentOffset.y = 0.0
para detener el desplazamiento vertical y scrollView.contentOffset.x = 0.0
para detener el desplazamiento horizontal, en la scrollViewDidScroll()
función de delegado. Sin embargo, creo que asegurarse de que sea scrollView.contentSize
igual a scrollView.frame.size
es una solución mejor (correcta). Vea la respuesta de @danbeaulieu.
desde el uso de iOS7
self.automaticallyAdjustsScrollViewInsets = NO;
// y crea tu 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];
self.collectionView.pagingEnabled = YES;
me ayudó a resolver el problema con el desplazamiento suave (sin arrastrar). El problema estaba en el método scrollViewWillEndDragging:
: targetContentOffset era el mismo que scrollView.contentOffset y la lógica de detección de página no funciona correctamente.
Solución rápida
Cree dos salidas, una para su vista y otra para su vista de desplazamiento:
@IBOutlet weak var myView: UIView!
@IBOutlet weak var scrollView: UIScrollView!
Luego, en su viewDidLayoutSubviews puede agregar el siguiente código:
let scrollSize = CGSize(width: myView.frame.size.width,
height: myView.frame.size.height)
scrollView.contentSize = scrollSize
Lo que hemos hecho es recopilar la altura y el ancho de la vista y configurar el tamaño del contenido de scrollViews para que coincida. Esto evitará que la vista de desplazamiento se desplace horizontalmente.
Más pensamientos:
CGSizeMake toma un ancho y un alto usando CGFloats. Es posible que deba usar la altura existente de UIScrollViews para el segundo parámetro. Que se vería así:
let scrollSize = CGSize(width: myView.frame.size.width,
height: scrollView.contentSize.height)
En mi caso, con Swift 4.2 puedes usar:
Deshabilitar el desplazamiento vertical:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.y = 0.0
}
Deshabilitar el desplazamiento horizontal:
func scrollViewDidScroll(_ scrollView: UIScrollView) {
scrollView.contentOffset.x = 0.0
}
Puede seleccionar la vista y luego Attributes Inspector
desmarcar User Interaction Enabled
.
En mi caso, el ancho de contentView era mayor que el ancho de UIScrollView y esa fue la razón del desplazamiento horizontal no deseado. Lo resolví estableciendo el ancho de contentView igual al ancho de UIScrollView.
Espero que ayude a alguien
Tenía el tableview contentInset establecido en viewDidLoad (como se muestra a continuación) que es lo que causa el desplazamiento horizontal
self.tableView.contentInset = UIEdgeInsetsMake(0, 30, 0, 0);
Compruebe si hay algún contenido de vista de tabla establecido por diferentes razones y desactívelo
Luché con esto durante algún tiempo intentando sin éxito las diversas sugerencias en este y otros hilos.
Sin embargo, en otro hilo (no estoy seguro de dónde) alguien sugirió que usar una restricción negativa en el UIScrollView funcionó para él.
Entonces probé varias combinaciones de restricciones con resultados inconsistentes. Lo que finalmente funcionó para mí fue agregar restricciones iniciales y finales de -32 a la vista de desplazamiento y agregar una vista de texto (invisible) con un ancho de 320 (y centrada).
Introducida en iOS 11 es una nueva propiedad en UIScrollView
var contentLayoutGuide: UILayoutGuide
La documentación indica que usted:
Utilice esta guía de diseño cuando desee crear restricciones de diseño automático relacionadas con el área de contenido de una vista de desplazamiento.
Junto con cualquier otra limitación de diseño automático que usted podría estar agregando que se desea limitar la widthAnchor
de los UIScrollView
's contentLayoutGuide
que ser del mismo tamaño que el 'marco'. Puede usar el frameLayoutGuide
(también introducido en iOS 11) o cualquier ancho externo (como susuperView
).
ejemplo:
NSLayoutConstraint.activate([
scrollView.contentLayoutGuide.widthAnchor.constraint(equalTo: self.widthAnchor)
])
Documentación: https://developer.apple.com/documentation/uikit/uiscrollview/2865870-contentlayoutguide
Una vez que lo hice reemplazando el UIScrollView con un UITableView con solo 1 celda, funcionó bien.
Utilice esta única línea.
self.automaticallyAdjustsScrollViewInsets = NO;