Tengo una UIScrollView
que contiene muchos UIImageView
s, UILabels, etc ... las etiquetas son mucho más largas que la UIScrollView
, pero cuando ejecuto la aplicación, no puedo hacer clic y desplazarme hacia abajo ...
¿Por qué podría ser esto?
Gracias
ios
iphone
ipad
uiscrollview
marca
fuente
fuente
Respuestas:
Siempre es bueno mostrar un fragmento de código de trabajo completo:
Swift 4.0
No he encontrado una manera de configurar contentSize en IB (a partir de Xcode 5.0) .
Nota: Si está utilizando Autolayout, el mejor lugar para colocar este código es dentro del
-(void)viewDidLayoutSubviews
método.fuente
myScrollView.delegate = self
TAMBIÉN, si esto todavía no funciona, la respuesta a continuación tiene un GRAN consejo (vaya a su xib / StoryBoard y asegúrese de que "AutoLayout" esté desactivado). Pro-Tip: También puede incluir<UIScrollViewDelegate>
en su archivo .h si desea hacer cosas como desplazar programáticamente su UIScrollView.viewDidLayoutSubviews
hizo funcionar para mí.Si no puede desplazar la vista incluso después de configurar contentSize correctamente, asegúrese de desmarcar "Usar AutoLayout" en Interface Builder -> File Inspector.
fuente
Debe establecer la
contentSize
propiedad de la vista de desplazamiento para que se desplace correctamente.Si está utilizando el diseño automático, es necesario conjunto
contentSize
enviewDidLayoutSubviews
el fin de que sea aplicada después de que se complete el autolayout.El código podría verse así:
fuente
contentSize
tamaño decontentView
, el tamaño de scrollView y contentView parece establecerse de la misma manera. Pero establecer la altura de lacontentSize
a un valor mayor que la altura decontentView
, funcionó.viewDidLayoutSubviews
puede llamarse varias veces durante un ciclo de vida para que corra el riesgo de aumentar la altura más de lo esperadoLa respuesta anterior es correcta: para que el desplazamiento sea posible, es necesario establecer el tamaño del contenido.
Si está utilizando el generador de interfaces, una buena manera de hacerlo es con los atributos de tiempo de ejecución definidos por el usuario. P.ej:
fuente
Intenta cambiar el tamaño del contenido a grandes cantidades. No podía entender por qué mi vista de desplazamiento no se desplaza incluso cuando su tamaño de contenido parece ser mayor que el tamaño de control. Descubrí que si el tamaño del contenido es más pequeño de lo necesario, tampoco funciona.
En lugar de 2000 puedes poner tus propios números grandes. Y si funciona, significa que el tamaño de su contenido no es lo suficientemente grande cuando cambia el tamaño.
El delegado no es necesario para que la vista de desplazamiento funcione.
fuente
Asegúrese de tener la propiedad contentSize de la vista de desplazamiento establecida en el tamaño correcto (es decir, una lo suficientemente grande como para abarcar todo su contenido).
fuente
Desmarcar 'Usar Autolayout' me sirvió.
Entorno: xCode 5.0.2 Storyboards ios7
fuente
En mi caso, tuve que establecerlo
delaysContentTouches
en verdadero porque los objetos dentro del scrollView capturaban los eventos táctiles y se manejaban a sí mismos en lugar de dejar que el propio scrollView lo manejara.fuente
Establecer
contentSize
propiedad deUIScrollview
enViewDidLayoutSubviews
método. Algo como estofuente
La idea de por qué la vista de desplazamiento no se desplaza porque configura el tamaño del contenido para desplazarse menos que el tamaño de la vista de desplazamiento, lo cual es incorrecto. Debe establecer el tamaño del contenido más grande que el tamaño de su vista de desplazamiento para navegar a través de él mientras se desplaza.
La misma idea con el zoom, establece el valor mínimo y máximo para el zoom que se aplicará mediante la acción de zoom.
bienvenidos :)
fuente
Una pequeña adición, todo lo anterior son las razones reales por las que su vista de desplazamiento puede no estar desplazándose, pero a veces sin pensar, esta podría ser la razón especialmente cuando la vista de desplazamiento se agrega a través del código y no IB, es posible que haya agregado sus subvistas a la vista principal y no a la vista de desplazamiento hace que la subvista no se desplace
y mantenga el tamaño del contenido establecido y más grande que el marco de vista principal (¡duhh!)
fuente
Lo hice funcionar en mi primer intento. Con diseño automático y todo, sin código adicional. Luego, una vista de colección se convirtió en banana, se bloqueó en el tiempo de ejecución, no pude encontrar lo que estaba mal, así que lo eliminé y lo recreé (estoy usando Xcode 10 Beta 4. Se sintió como un error) y luego el desplazamiento desapareció. ¡Sin embargo, la vista Colección volvió a funcionar!
Muchas horas después ... esto es lo que me arregló. Tenía el siguiente diseño:
UIView
Todo está en las limitaciones. El área segura se define automáticamente por el sistema. En el peor de los casos, elimine todas las restricciones para las vistas de desplazamiento y contenido y no haga que IB las restablezca / cree por usted. Hazlos manualmente, funciona.
Básicamente, el concepto es tener una vista de contenido que se ajuste a Scrollview, que se ajusta al área segura.
Pero como tal no funcionó. La vista de contenido perdió la altura. Intenté todo lo que pude y el único que hizo el truco fue una vista de contenido que creó la vista de contenido arrastrando el control . Eso definió una altura fija, cuyo valor se calculó a partir del Tamaño del controlador de vista (definido como forma libre, más largo que la pantalla real, hasta contener todas mis subvistas) y finalmente funcionó nuevamente.
fuente
si recibe un mensaje (IOS8 / swift) que
viewDidLayoutSubviews
no existe, utilice lo siguienteEsto me lo arregló
fuente
¡Algo que no se mencionó antes!
¡Asegúrese de que su toma de corriente esté conectada correctamente al scrollView! Debería tener un círculo lleno, pero incluso si tiene un círculo lleno, scrollView puede no estar conectado, ¡así que vuelva a verificar! Pase el cursor sobre el círculo y vea si la vista de desplazamiento real se resalta. (Este fue un caso para mí)
fuente
Muchas veces el código es correcto si ha seguido un tutorial, pero lo que muchos principiantes no saben es que scrollView NO se desplazará normalmente por el simulador. Se supone que debe desplazarse solo cuando presiona el mousepad y se desplaza simultáneamente. Muchos usuarios experimentados de XCode / Swift / Obj-C están tan acostumbrados a hacer esto y no saben cómo los principiantes podrían pasarlo por alto. Ciao :-)
Este código funcionará perfectamente bien siempre y cuando hagas lo que dije arriba
fuente
Si ninguna de las otras soluciones funciona para usted, verifique que su vista de desplazamiento esté
UIScrollView
en Interface Builder.En algún momento en los últimos días, mi
UIScrollView
tipo cambió espontáneamente a unUIView
, a pesar de que su clase lo dijoUIScrollView
en el inspector. Estoy usandoXcode 5.1 (5B130a)
.Puede crear una nueva vista de desplazamiento y copiar las medidas, configuraciones y restricciones de la vista anterior, o puede cambiar manualmente su vista a a
UIScrollView
en elxib
archivo. Hice una comparación y encontré las siguientes diferencias:Original:
Después del tipo cambiado espontáneamente:
Así que reemplacé la
<view>
línea con mi<scrollView>
línea original .También reemplacé la etiqueta de cierre de la vista
</view>
con</scrollView>
.Asegúrese de mantener la identificación igual que la vista actual, en este caso: id = "qRn-TP-cXd".
También tuve que eliminar el xib del caché de Xcode eliminando los datos derivados de la aplicación:
Xcode->Window->Organizer->Projects
, elija su proyecto, en la línea Datos derivados, haga clic en Eliminar ...O si usa un dispositivo:
Xcode->Window->Organizer->Device
, elija su dispositivo-> Aplicaciones, elija su aplicación, haga clic en (-)Ahora limpie el proyecto y elimine la aplicación del simulador / dispositivo:
Xcode->Product->Clean
Simulator/device->press
y mantenga presionada laapp->click
(X) para eliminarloEntonces debería poder compilar y ejecutar su aplicación y tener la funcionalidad de desplazamiento nuevamente.
PD: No tuve que configurar el tamaño del contenido de la vista de desplazamiento
viewDidLayoutSubviews
ni desactivar el diseño automático, pero YMMV.fuente
Si su
scrollView
es una subvista decontainerView
algún tipo, entonces asegúrese de quescrollView
esté dentro del marco o los límites decontainerView
. Tenía locontainerView.clipsToBounds = NO
que todavía me permitía ver el scrollView, pero porquescrollView
no estaba dentro de los límitescontainerView
, no detectaría eventos táctiles.Por ejemplo:
Podrá ver el scrollView pero no recibirá interacciones del usuario.
fuente
agregar el siguiente código
viewDidLayoutSubviews
funcionó para mí con Autolayout. Después de probar todas las respuestas:fuente
Agregar
UIScrollViewDelegate
y agregar el siguiente código alviewDidAppear
método lo arregló para mí.fuente
Mi problema fue resuelto por:
Una vez que eliminé las restricciones superiores y / o inferiores vinculadas al área segura y / o la supervista, ¡las vistas dentro de scrollView podrían desplazarse nuevamente y no quedaron fijas en la parte superior inferior de la pantalla!
Espero que esto detenga a alguien más de horas de dolor con este problema en particular.
fuente
otro caso divertido más:
scrollview.superview.userInteractionEnabled debe ser verdadero
Perdí más de 2 horas persiguiendo esto solo para descubrir que el padre es UIImageView que, naturalmente, tiene userInteractionEnabled == false
fuente
Después de fallar con las respuestas proporcionadas en este hilo, me topé con este artículo con la solución.
Hay dos cosas no intuitivas sobre la configuración de la vista de desplazamiento con autolayout:
Esta es la esencia de ese artículo. Para una explicación completa, incluyendo ilustraciones, échale un vistazo.
fuente
Descubrí que con este problema de AutoLayout ... si solo hago el
ViewController
uso enUIView
lugar deUIScrollView
para la clase ... entonces solo agrego unUIScrollView
yo ... que funciona.fuente
Tuve el mismo problema en el IB.
Después de establecer el inicio, el final, la parte superior e inferior de scrollView en su superView. Hice los siguientes cambios para hacer que containerView se desplazara, lo que funcionó.
Para hacer que scrollView solo se desplace en dirección horizontal, haga la restricción con scrollView's centerY = ContainerView's centerY
y para que se pueda desplazar verticalmente, haga que centerView de scrollView = centerX de ContainerView
fuente