UIScrollView AutoLayout Vertical Only

Quiero que AutoLayout funcione con UIScrollView y tengo un pequeño problema con él. Esto es lo que hice:

  1. Agregue un UIScrollView dentro de la vista principal con el marco: [arriba: 0, a la izquierda: 0, ancho: 320, alto: 568]

  2. Agregue UIView " UIView " dentro de UIScrollView con marco y bgcolor negro: [top: 0, a la izquierda: 0, ancho: 320, alto: 568]

  3. Configurar restricciones UIScrollView : [arriba: 0, abajo: 0, a la izquierda: 0, a la derecha: 0]

  4. Configurar restricciones "ContentView": [arriba: 0, abajo: 0, a la izquierda: 0, a la derecha: 0]

  5. Alinear los elementos dentro del "ContentView"

  6. Establezca la vista principal bgcolor en gris (para ver lo que está sucediendo)

Aquí hay una captura de pantalla del problema: http://imgur.com/P8s9lB0

Por alguna razón, las restricciones hacen que la vista de contenido esté en el centro de la pantalla. Además, se desplaza en todas direcciones. Quiero que el contenido sea desplazable solo en dirección vertical como en UITableView , por lo que no puedo moverlo así: http://imgur.com/lBCwfAS

¿Qué estoy haciendo mal? He verificado todos los tutoriales y respuestas que puedo encontrar en StackOverflow y Google, y nadie realmente tiene un problema extraño, por lo que solicito ayuda.

EDIT: También agregué el ancho y la altura de ContentView como restricciones y eso tampoco ayudó.

Para deshabilitar el desplazamiento horizontal, puede establecer el tamaño de contenido en el método (void) scrollViewDidScroll.

 [self.scrollView setContentOffset: CGPointMake(0, self.scrollView.contentOffset.y)]; 

También querrá configurar el locking direccional para que solo se use 1 dirección de desplazamiento a la vez. https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/occ/instp/UIScrollView/directionalLockEnabled

 self.scrollView.directionalLockEnabled = YES; 

Para resumir la respuesta de Leszek S:

Para tener una vista de desplazamiento vertical, todas las vistas dentro de la vista de desplazamiento deben tener su restricción de ancho establecida. Fácil de configurar en la vista de supervisión de la vista de desplazamiento.

La razón es que la vista de desplazamiento no se desplazará horizontalmente, siempre y cuando ninguna de sus subvistas tenga que desplazarse horizontalmente. Por ejemplo, si tiene una label, establezca en 0 líneas, el layout automático intentará hacer que la label sea lo más ancha posible antes de que comience a agregar líneas y saltos de línea. Si no hay restricciones de ancho explícitas en la label, hará que el área de contenido de la vista de desplazamiento sea más ancha. Las restricciones para seguir a la vista de desplazamiento se ignoran.

Si tiene varias vistas, es posible que desee colocarlas dentro de una sola vista que contenga como en ese video. Para mi caso, solo tengo 5 o 6 tags que pueden cambiar de forma dinámica la altura, pero nunca deben cambiar el ancho, así que simplemente las hice del mismo ancho que la vista de desplazamiento. Y bingo, vista de desplazamiento vertical con tags que aumentan o networkingucen dependiendo del text.

Puedes hacer esto usando restricciones y es muy fácil.

UIScrollView solo necesita comprender la cantidad de espacio y ancho que tiene dentro. Por lo tanto, debe tener algo fijado a las limitaciones de Leading , Trailing , Top e Bottom . También es necesario corregir el ancho y la altura del contenido (esto no significa que tenga que especificarlo. Todavía puedo usar restricciones para lograrlo).

  1. Agregue una UIScrollView y UIScrollView según sea necesario.
  2. Agregue una UIView dentro de UIScrollView para el contenido.
  3. Establezca las restricciones UIView , Trailing , Top & Bottom del contenido UIView para que sea 0.
  4. Agregue una restricción de Equal Width a UIScrollView y UIView . Esto hará que solo se desplace verticalmente.
  5. Ahora debe establecer la altura de la UIView contenido. A continuación, puede especificar la altura de la vista de contenido (blech) o utilizar la altura de los controles contenidos asegurándose de que el control inferior esté restringido a la parte inferior de la vista de contenido.

Hice esto y funcionó como un regalo.

He escrito una function que permite desplazar el contenido verticalmente pero no horizontalmente. Crea una vista UIV con ancho limitado dentro de scrollview e incrusta todas las sub vias scrollview en ella.

 TegScrolledContent.createContentView(scrollView) 

https://github.com/exchangegroup/scrollable-content-ios

introduzca la descripción de la imagen aquí

Dar contenido ver restricciones explícitas de altura y ancho

A continuación se muestra un fragment que he utilizado para get una vista de desplazamiento vertical. Funciona al agregar una vista de contenido como una vista secundaria de una vista de desplazamiento, y restringir el ancho de esa vista de contenido al ancho de la vista de desplazamiento principal. A partir de entonces, todas las subvistas deben agregarse a la vista de contenido en lugar de a la vista de desplazamiento.

 // View that will contain content of scroll view. Width is constrained to the width of the scroll view. UIView *contentView = [[UIView alloc] init]; contentView.translatesAutoresizingMaskIntoConstraints = NO; [scrollView addSubview:contentView]; views[@"contentView"] = contentView; [scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeWidth relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeWidth multiplier:1.0 constant:0.0]]; [scrollView addConstraint:[NSLayoutConstraint constraintWithItem:contentView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0]]; [scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|" options:0 metrics:nil views:views]]; // Now, add all your subviews to contentView 

Junto con la respuesta de @ derek, quisiera agregar que la configuration de contenido Offline siempre en scrollViewDidScroll causará problemas de performance. Por lo tanto, verifique solo si x no es 0 y luego configure contentOffset

  if(contentOffset.x != 0){ setContentOffset(CGPointMake(0, contentOffset.y), animated: false) } 

y sí a scrollview

 directionalLockEnabled = true