Cómo hacer un ScrollView con AutoLayout en Xcode5

En xcode 5, utilizando storyboards, ¿cómo se puede hacer una scrollview de desplazamiento vertical completamente operativa, con AutoLayout ON?
Teniendo en count que las subvistas tienen jerarquía:

1.UIView 2.UIScrollView 3.UIView (lets call this UIDetailView to make things easier) 

Sea específico del código a las restricciones para que cualquiera de las vistas TENGA que ser más pequeño, etc.

Esta publicación de blog detalla cómo utilizar un UIScrollView con Autolayout ON, utilizando un enfoque de autoajuste puro. Tenga en count que todas las restricciones en la publicación del blog se definen a través del Storyboard.

El enfoque en la publicación asume la siguiente jerarquía:

 1. View (main view of my UIViewController) 2. Scroll View (UIScrollView) 3. Container View (UIView) 4. Content View (eg UIImageView) 

Supongo que la vista de contenedor será su UIDetailView, y la vista de contenido será cualquier UIView dentro de su UIDetailView.

https://happyteamlabs.com/blog/ios-how-to-use-uiscrollview-with-auto-layout-pure-auto-layout/

UIScrollView con Autolayout en Storyboards Just Works

He visto a varias personas recomendando el enfoque 'Visión de contenedor', AKA fuerza bruta, para resolver el problema que no entienden. No es óptimo ya que ahora ha perdido una gran ventaja de scrollview al hacerle creer que el contenido es la vista de desplazamiento completa en lugar de las subidas inmediatamente adjuntas a la vista de desplazamiento.

Aquí es cómo lo hice en el ejemplo que sigue

 --UIScrollView |-> UITextView |-> UILabel |-> UIOtherStuff 

Cuando coloque un UIScrollView en una UIView en un Storyboard, simplemente UIView los bordes en los 4 lados de UIScrollView en UIView . Ahora agregue su contenido a UIScrollView asegurándose de que proporciona un mínimo de dos restricciones para cada dimensión. Lo mejor de Autolayout es que se da count de qué tan grande es el tamaño de contenido de scrollview, o UILabels para ese asunto, que debe basarse en el tamaño del contenido dentro de él. AKA intrinsicContentSize. Entonces, si le dan una advertencia 'Tamaño de contenido ambiguo para scrollView', sabe que no le ha dado al contenido suficientes restricciones. Por ejemplo, es posible que haya dado una distancia de separación Superior, Inferior, Izquierda, Derecha entre vistas, pero la subview que está restringiendo también necesita una altura, ya que un plano vertical infinito como este UIScrollView podría asumir que su vista era de cero a infinitamente alta.

Para decirlo de otra manera, la guía de Apple en Autolayout by Example hace un simple plan de 3 puntos para el éxito:

  1. Cree la vista de desplazamiento.
  2. Coloque el elemento de interfaz de usuario dentro de él.
  3. Cree restricciones que definan completamente el ancho y la altura del contenido de la vista de desplazamiento.

Ese TextView superior con 'Min melding til' también está creciendo a medida que escribe más líneas en él y todo el ScrollView crece para contenerlo. Si bien UITextView class UITextView para devolver una restricción de altura modificada, ScrollView funciona correctamente sin encoding.

Una última cosa, muchas publicaciones relacionadas con Autolayout testing la corrección mágica: todo conjuro traduceAutorizarMaskIntoConstraints translatesAutoresizingMaskIntoConstraints = NO . Esto solo es necesario si la vista se crea mediante progtwigción.

Ejemplo de UIScrollView con Autolayout

La documentation indica claramente cómo hacer esto: Un UIScrollView en layout automático siempre cambiará de tamaño para ajustarse al contenido (UIDetailView).

Entonces debes configurar tus puntos de vista de esta manera:

  • UIView: Posición con restricciones.
  • UIScrollView: Enlace a UIView con restricciones.
  • UIDetailView: Establezca el tamaño (tamaño de contenido intrínseco), la resistencia de compression máxima, establezca las restricciones superior, inferior, delantera y posterior a UIScrollView en 0 manualmente.

Tuve un problema similar y encontré una solución relativamente simple similar a DJ S's dentro de Interface Builder usando Autolayout puro sin ningún código.

Para la testing de concepto, primero elimine cualquier restricción en View Controller si ve que esto funciona.

Este es el layout de muestra:

  • Ver (vista principal de mi UIViewController)

    • Vista de desplazamiento (UIScrollView)

      • Vista de contenedor (UIView)

        • Vista de contenido (por ejemplo, UIImageView)

A. Desplazar Vista ancho / alto debe ser más pequeño que Contenedor Vista ancho / alto

B. La vista de contenedor debería tener un ancho / alto determinado (puede ser ancho / alto explícito)

C. Haga Control-arrastre la vista del contenedor para desplazarse y solo agregue:

  1. Leading Space to Container
  2. Trailing Space to Container

D. Echa un vistazo a esas dos restricciones y establece el valor "constante" para ambos en 0

E. Ejecutar aplicación y

Debido a los nuevos tamaños de pantalla de iPhone 6 y 6+, tuve que hacer algunos retoques a la solución de DJ S.

La meta

Coloque una UITextView dentro de un UIScrollView , y también tenga 15 espacios de pt desde los bordes de la pantalla izquierda / derecha.

Puntos de vista

 1. Main View (main view of my UIViewController) 2. Scroll View (UIScrollView) 3. Container View (UIView) 4. Text View (UITextView) 

Solución

Para los espacios, agregué espacios horizontales posteriores / finales de 15 pt desde UIScrollView -> Main View . Para hacer que el ancho de UITextView relativo al ancho de la pantalla, agregué una restricción Equal Widths de UITextView -> Main View y establezco el valor en -30 (2 * el espacio horizontal de 15 pt). Ahora, el ancho de UITextView se ajustará dinámicamente para cualquier tamaño de pantalla.

UIScrollView debería tener Scrolling Enabled . La UITextView no debería hacerlo .