page control ios objective-c autolayout

ios - uipageviewcontroller



UIScrollView Paging Autolayout & Storyboard (3)

Hay muchas respuestas con respecto a las vistas de desplazamiento con autolayout y muchas sobre la paginación de scrollview, pero no puedo encontrar una sola cosa que aborde ambas.

No estoy tratando de hacer nada sofisticado ... solo 7 vistas de imagen en pantalla completa que me gustaría desplazar horizontalmente con la paginación, pero por simplicidad (¡ja!), Decidí intentarlo todo en el guión gráfico .

El controlador está configurado para tamaño de forma libre con un ancho de 2240 (320*7) . Luego lo configuro de la manera que Apple sugiere para el autolayout ...

UIScrollview /-----UIView /----------Content (7 image views)

La vista de desplazamiento tiene restricciones 0/0/0/0 en todos los bordes, al igual que la vista UIV en su interior.

Cuando Paging Enabled está desactivado, se comporta muy bien, exactamente como se esperaba. Pero una vez que enciendo el Buscapersonas, un deslizamiento hace que la vista se vuelva loca, se desplace por todo el ancho de 2240 , y luego rebote y finalmente llegue a la página correspondiente.

Sé que tengo la opción probada y verdadera de simplemente deshacerme de todo y hacerlo programáticamente, pero mi terquedad quiere resolver esto. ¡Debe ser posible!


Es posible usar el tamaño de scrollView para establecer el tamaño de contentView, a diferencia de https://developer.apple.com/library/ios/technotes/tn2154/_index.html ; Esto fue probado en iOS 8.2 beta 3.

Tenga en cuenta que hice esto mediante programación, pero espero que esto sea útil para alguien. La jerarquía es:

root: UIView scrollView: UIScrollView contentView: UIView page0 page1 ...

  1. Agregue restricciones a la posición scrollView relativa a la raíz y a los hermanos de scrollView.

  2. Adjunte el lado de contentView a su supervisión (scrollView): "H: | [contentView] |"
    "V: | [contentView] |"

  3. Añadir restricciones de igualdad de tamaño a contentView y scrollView; esta es la parte que contradice TN2154 (que dice "no confíe en la vista de desplazamiento para obtener su tamaño"):

    contentView.height == scrollView.height
    contentView.width == scrollView.width

Nota: la anterior es una notación inventada para una restricción de altura instanciada mediante programación.

  1. Coloque las páginas en relación con su supervisión (contentView); Hice esto al pegar la primera página a la izquierda / arriba al contenidoVista a la izquierda / arriba, y las páginas posteriores a la izquierda / arriba a la página anterior a la derecha / arriba.

Gracias a Koustub por llevarme por el camino correcto: su solución funciona, pero con algunos problemas pude eliminar la vista ficticia.


Siga Trabajando con vistas de desplazamiento para crear UIScrollView de paginación con contenido en Interface Builder.

También recomendaría usar la vista de pila como una vista de contenido para su UIScrollView, ya que permite reducir esencialmente la complejidad del diseño.

Cuando utiliza el enfoque tradicional, cada vista de entrada dentro de la vista de contenido tiene al menos 5 restricciones :

  • llevando a la entrada anterior
  • arriba a los padres
  • arrastrando a la siguiente entrada
  • de abajo a los padres
  • ancho igual a la vista de desplazamiento

La vista de pila organiza su contenido automáticamente, por lo tanto, la única restricción que debe tener cada entrada es "ancho igual a la vista de desplazamiento"

Verifique este proyecto https://github.com/eugenebrusov/ios-stack-paging-scroll para ver la vista de pila en acción.


Tengo un UIScrollView con paginación y AutoLayout funcionando perfectamente bien. He aquí mi arreglo:

UIView // Main view |---> Dummy UIView // See below |---> UIScrollView |---> Content UIView |---> Page 1 Container |---> Page 2 Container

Las restricciones que utilicé son Dummy UIView -> Parent UIView es lo que quiero que sea el tamaño de la vista de desplazamiento de paginación, y UIScrollView -> Dummy UIView es (0,0,0,0) en todos los lados. Esto es solo un elemento de diseño automático regular que crea una UIView ficticia donde quiero colocar la vista de desplazamiento y un UIScrollView que llena completamente la UIView ficticia.

Consulte la nota técnica de Apple para AutoLayout y UIScrollViews : https://developer.apple.com/library/content/technotes/tn2154/_index.html

El contenido dentro del scrollview debe tener un tamaño intrínseco. No puede confiar en el scrollview para obtener su tamaño.

Como se indica en la nota técnica, establezca las restricciones de los cuatro lados de la Content View en UIScrollView a (0,0,0,0). Los valores exactos realmente no importan, ya que todo lo que le está diciendo a UIScrollView es que esta es la vista para obtener el contentSize de contentSize .

En este punto, Xcode se quejará de que la Content View no tiene un tamaño intrínseco. Y aquí está el truco: aquí es donde usamos la vista Dummy UIView que creamos anteriormente. El tamaño de la Dummy UIView es precisamente el tamaño de cada página en el UIScrollView .

Por lo tanto, establecemos la altura de Content UIView igual a la altura de Dummy UIView y el ancho de Content UIView igual al número de páginas multiplicado por el ancho de Dummy UIView usando Dummy UIView . (Para el cambio posterior, el multiplicador en la restricción será el número de páginas).

Ahora cree páginas dentro de Content UIView como lo haría normalmente y configure Paging Enabled en yes en su UIScrollView y listo, tiene la paginación en un UIScrollView usando AutoLayout.

He probado esto en iOS 6, 7 y 8.

Actualizar:

Aquí hay un proyecto de ejemplo con esta configuración según lo solicitado: https://github.com/kostub/PagingScrollView