UIScrollView: Bloquear el desplazamiento al eje vertical cuando se hace zoom sin cambiar el contenido principal.
¿Cuál es la mejor manera de bloquear dinámicamente el desplazamiento en un UIScrollView en el eje vertical dependiendo de la escala de zoom? Quiero permitir desplazar un lienzo grande en cualquier dirección cuando está alejado (scrollView.zoomScale < 1.0) pero evitar completamente el desplazamiento horizontal cuando está acercado (scrollView.zoomScale == 1.0).
El desafío aquí es que UIScrollView parece no tener una configuración incorporada para limitar el desplazamiento a una dirección si el contentView es más grande que la ventana en ambas direcciones. Me gustaría usar el mismo contentView grande pero no permitir el desplazamiento horizontal cuando está acercado.
(Sé sobre scrollView.isDirectionalLockEnabled, pero eso no es lo que necesito: solo verifica si el gesto de desplazamiento del usuario tiene una dirección de desplazamiento dominante y luego bloquea dinámicamente el desplazamiento en una dirección).
¡Gracias!
davy.ai
Una forma de bloquear dinámicamente el desplazamiento en un
UIScrollView
en el eje vertical dependiendo de la escala de zoom es implementando los métodosscrollViewDidScroll
yscrollViewDidZoom
delUIScrollViewDelegate
.Primero, establece la propiedad
isDirectionalLockEnabled
delUIScrollView
entrue
para asegurarse de que el gesto de desplazamiento del usuario tenga una dirección dominante.Luego, en el método
scrollViewDidZoom
, verifica la propiedadzoomScale
delUIScrollView
. Si es menor que 1.0, establece la propiedadcontentSize
delUIScrollView
al tamaño del grancontentView
para permitir el desplazamiento en cualquier dirección. Si es igual a 1.0, establece la propiedadcontentSize
delUIScrollView
al tamaño del marco delUIScrollView
para deshabilitar el desplazamiento horizontal.En el método
scrollViewDidScroll
, verifica la propiedadzoomScale
y la propiedadcontentOffset
delUIScrollView
. Si elzoomScale
es igual a 1.0 ycontentOffset
no está en el eje vertical, reiniciacontentOffset
al desplazamiento vertical más cercano.Aquí tienes un ejemplo de implementación: