ios - not - ¿Cómo puedo usar Autolayout para establecer restricciones en mi UIScrollview?
swift scrollview not scrolling (18)
Ejemplo simple autocontenido
A juzgar por la gran cantidad de votos sobre la cuestión y el bajo número de votos sobre las respuestas, las personas no encuentran una solución comprensible y rápida aquí. Déjame intentar agregar uno. Este proyecto es un ejemplo autónomo hecho completamente en Interface Builder. Debería poder solucionarlo en 10 minutos o menos. Luego puede aplicar los conceptos que aprendió a su propio proyecto.
La pregunta original pregunta sobre los botones de desplazamiento. Aquí solo uso UIView
s pero pueden representar cualquier vista que desee. También elegí el desplazamiento horizontal porque las capturas de pantalla del guión gráfico son más compactas para este formato. Sin embargo, los principios son los mismos para el desplazamiento vertical.
Conceptos clave
-
UIScrollView
solo debe usar una subvista. Esta es una ''UIView'' que sirve como vista de contenido para contener todo lo que desea desplazar. - Haga que la vista de contenido y el elemento primario de la vista de desplazamiento tengan la misma altura para el desplazamiento horizontal. (Anchos iguales para desplazamiento vertical)
- Asegúrese de que todo el contenido desplazable tenga un ancho establecido y esté anclado en todos los lados.
Comience un nuevo proyecto
Puede ser solo una aplicación de vista única.
Storyboard
En este ejemplo, haremos una vista de desplazamiento horizontal. Seleccione View Controller y luego elija Freeform en Size Inspector. Haz el ancho de 1,000
y la altura de 300
. Esto solo nos da espacio en el guión gráfico para agregar contenido que se desplazará.
Agregar una vista de desplazamiento
Agregue un UIScrollView
y UIScrollView
los cuatro lados en la vista raíz del controlador de vista.
Agregar una vista de contenido
Agregue una UIView
como subvista a la vista de desplazamiento. Esta es la clave. No intente agregar muchas subvistas a la vista de desplazamiento. Solo agrega una sola UIView
. Esta será su vista de contenido para las otras vistas que desea desplazar. Fija la vista de contenido a la vista de desplazamiento en los cuatro lados.
Alturas iguales
Ahora en el contorno del documento, Comando haga clic en la vista de contenido y en la vista principal de la vista de desplazamiento para seleccionar ambas. Luego configure las alturas para que sean iguales (arrastre el control desde la vista de contenido a la vista de desplazamiento). Esto también es clave. Debido a que estamos desplazándonos horizontalmente, la vista de contenido de la vista de desplazamiento no sabrá qué tan alto debe ser a menos que lo configuremos de esta manera.
Nota:
- Si hiciéramos que el contenido se desplace verticalmente, estableceríamos que el ancho de la vista del contenido sea igual al ancho del elemento principal de la vista de desplazamiento.
Agregar contenido
Agregue tres UIView
y déles todas las restricciones. Usé 8 puntos de margen para todo.
Restricciones:
- Vista verde: fija los bordes superior, izquierdo e inferior. Haz el ancho 400.
- Vista roja: fija los bordes superior, izquierdo e inferior. Haz el ancho 300.
- Vista púrpura: fijar los cuatro bordes de los bordes. Haga el ancho cualquiera que sea el espacio restante (268 en este caso).
Establecer las restricciones de ancho también es clave para que la vista de desplazamiento sepa cuán amplia será su vista de contenido.
Terminado
Eso es todo. Puede ejecutar su proyecto ahora. Debería comportarse como la imagen desplazable en la parte superior de esta respuesta.
Para el desplazamiento vertical, simplemente cambie todas las direcciones de ancho y alto en este ejemplo (probado y en funcionamiento).
Estudio adicional
He pasado dos días probando las diversas soluciones para los enfoques Mixto y Pure Autolayout para lograr lo que era una configuración trivial de scrollview antes de la ejecución automática, y ahora es oficial. Debo ser demasiado estúpido. Lo estoy configurando principalmente en Storyboard (bueno, así son las cosas).
Así que aquí está mi petición de ayuda.
Viewtree:
UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton
Se supone que los botones se desplazan horizontalmente (de izquierda a derecha y viceversa). ¿Alguien puede decirme cómo establecer las restricciones para lograr esto usando Autolayout puro?
-
He intentado el enfoque mixto, así:
UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton
... y estableciendo restricciones de ancho y altura fijas para la contentview
y las configuraciones de translatesAutoresizingMaskIntoConstraints
según el TechNote de Apple. Los botones y la vista de desplazamiento se configuran usando restricciones. Esto hace que scrollview se desplace (yay) pero, ¡ay !, se desplaza demasiado lejos! Por lo que puedo decir, el ancho de desplazamiento se duplicó de alguna manera a partir de lo que configuré la vista de contenido en ??? !!! ???
Intenté también el enfoque de autolacado puro, tanto con contentview
como sin contenido. Todas las vistas se translatesAutoresizingMaskIntoConstraints=NO
, excepto para self.view
. Los botones tienen restricciones de ancho / altura fijas y están fijados a los cuatro bordes de la vista de desplazamiento. Nada se desplaza.
Así que estoy totalmente desconcertado por qué no puedo hacer que funcione correctamente. Cualquier ayuda es muy apreciada, y si necesita cualquier otra información, ¡pregunte!
Captura de pantalla actualizada con solución - restricciones de buttonZ:
EDIT @ Jamie Forrest Entonces, la solución resulta ser la restricción final incorrecta en el último botón. En lugar de 6441, el valor que había establecido era negativo, -6441. Lo difícil es que al establecer el valor en el guión gráfico, hay dos opciones en la barra de herramientas Pin:
El valor del lienzo actual es negativo (lo que lleva a que no haya desplazamiento), y la opción a continuación es positiva (activación del desplazamiento). Esto significa que no soy estúpido, pero al menos medio ciego, supongo. Aunque, en mi defensa, ¿no es algo inquietante que XCode no muestre un error para la configuración "incorrecta"?
EDITAR OTRA VEZ Ahora esto es gracioso ... cambiando el valor final de -6441 (sin desplazamiento) al desplazamiento habilitado para 6441. Pero mi viejo amigo, el "demasiado conteo de contenidos", regresó, ¡lo que dio lugar a un tamaño de contenido dos veces más grande de lo que debería ser! La solución para obtener el desplazamiento de contenido correcto era establecer la restricción final en CERO. Esto no es obvio cuando se trabaja en Storyboard, pero al mirar el código de @Infinity James, es lo que debería ser.
Deberías organizar tu diseño como este
ViewControllerView
contiene ScrollView
, ScrollView
contiene ContainerView
, ContainerView
contiene 2 Labels
Luego sigue 3 pasos para hacer que tu ScrollView
pueda desplazarse
- Configurar el pin
ScrollView
(arriba / derecha / abajo / izquierda) enViewControllerView
- Establecer el pin
ContainerView
(arriba / derecha / abajo / izquierda) enScrollView
- Establecer
Horizontally in Container
( no establecerVertically in Container
)
- Establecer el pin
-
Label1
pin ( arriba / derecha / izquierda) aContainerView
-
Label1
pin (derecho / izquierdo / inferior ) aContainerView
y superior aLabel1
-
Espero que esto ayude
Después de un tiempo lidiando con este problema, finalmente encontré una solución. Estoy trabajando con guiones gráficos de clases universales (600x600). Creé una UIView (contentView) del tamaño de scrollView y las restricciones creadas en Top, Bottom, Leading y Trailing para scrollView. Luego recorté el tamaño manualmente de contentView a 600x600. El guión gráfico dejó de intentar cambiar el tamaño de todo y pude trabajar, pero la vista se veía horrible en el dispositivo o simulador real. Hice 2 salidas de restricción de estos tamaños recortados.
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;
Luego, en viewDidLoad
CGSize viewSize = self.view.frame.size;
self.contentViewWidthConstraint.constant = viewSize.width;
self.contentViewHeightConstraint.constant = viewSize.height;
Funciona genial.
El contentSize se establece implícitamente aplicando las restricciones dentro de UIScrollView.
Por ejemplo, si tiene UIScrollView dentro de UIView, se verá así (como estoy seguro de que sabe):
UIView *containerView = [[UIView alloc] init];
UIScrollView *scrollView = [[UIScrollView alloc] init];
[containerView addSubview:scrollView];
containerView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(containerView, scrollView);
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
options:kNilOptions
metrics:nil
views:viewsDictionary]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
options:kNilOptions
metrics:nil
Eso establecerá que scrollView llene el tamaño de la vista de contenedor (para que containerView tenga que ser de un cierto tamaño).
A continuación, puede ajustar el tamaño del contenido de UIScrollView estableciendo implícitamente que sea lo suficientemente grande como para mantener los botones de esta manera:
UIButton *buttonA = [[UIButton alloc] init];
UIButton *buttonB = [[UIButton alloc] init];
UIButton *buttonC = [[UIButton alloc] init];
[scrollView addSubview:buttonA];
[scrollView addSubview:buttonB];
[scrollView addSubview:buttonC];
buttonA.translatesAutoresizingMaskIntoConstraints = NO;
buttonB.translatesAutoresizingMaskIntoConstraints = NO;
buttonC.translatesAutoresizingMaskIntoConstraints = NO;
viewsDictionary = NSDictionaryOfVariableBindings(scrollView, buttonA, buttonB, buttonC);
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonA]-|"
options:kNilOptions
metrics:nil
views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonA]-[buttonB]-[buttonC]-|"
options:NSLayoutFormatAlignAllBaseline
metrics:nil
views:viewsDictionary]];
El enfoque de autodiseño puro funciona muy bien, pero es bastante complicado configurarlo si está migrando desde una configuración no automática. Lo he hecho varias veces y tengo algunos consejos generales:
- Comience poco: incluso si eso significa recrear las vistas de su guión gráfico, comience con solo unos pocos elementos y construya sus vistas lentamente, asegurándose de probar que el desplazamiento funciona después de agregar algunos elementos.
- Desactivar traduceAutoresizingMaskIntoConstraints en todo: esta fue siempre la causa de los conflictos de restricción para mí.
- Configure correctamente sus restricciones de UIScrollView: asegúrese de que la vista de desplazamiento esté conectada por todos lados a la vista principal, de lo contrario, simplemente no se expandirá.
Enfrenté un problema similar. Configuré todas las restricciones y siempre me preguntaba por qué todavía cambia el tamaño de algunas subvistas. Mi solución fue configurar clipsToBounds a SÍ.
Es difícil ver los valores exactos y la configuración de tus restricciones a medida que las pegaste aquí, así que no estoy seguro de mirar tus capturas de pantalla en las que te equivocaste.
En lugar de una explicación de lo que está mal en su configuración, he creado un proyecto de muestra básico con una jerarquía de vista y una configuración de restricciones muy similares a la que usted describe. El desplazamiento horizontal funciona como se espera en el proyecto de muestra, que utiliza el enfoque "Pure AutoLayout" que Apple describe en la Nota técnica .
También tuve muchos problemas para que Auto Layout funcionara con UIScrollView
. La clave para hacerlo funcionar es asegurarse de que todos los elementos en la vista de desplazamiento, en conjunto, tengan restricciones que eventualmente se vinculen a todos los lados de la vista de desplazamiento y que contribuyan al sistema AutoLayout pudiendo determinar un tamaño de contenido para el vista de desplazamiento que será más grande que su marco. Parece que intentabas hacer eso en tu código, pero tal vez tenías algunas restricciones superfluas que hacían demasiado pequeño el contenido.
También es de destacar que, como mencionaron otros, con AutoLayout y UIScrollview, ya no configuras contentSize explícitamente. El sistema AutoLayout calcula el tamaño del contenido en función de sus limitaciones.
También encontré que este capítulo de libros electrónicos fue muy útil para hacerme entender cómo funciona todo esto. Espero que todo esto ayude.
Hay tantas preguntas sobre el uso de AutoLayout con UIScrollView, el punto clave que ignoramos es que las vistas internas de UIScrollView establecen restricciones con respecto a la Vista de contenido, pero no a UIScrollView. Consulte la nota técnica TN2154 , puede encontrar:
La clase UIScrollView desplaza su contenido cambiando el origen de sus límites. Para que esto funcione con Diseño automático, los bordes superior, izquierdo, inferior y derecho dentro de una vista de desplazamiento ahora significan los bordes de su vista de contenido.
La siguiente figura representará eso:
Puede encontrar que el espacio final es de 500 puntos, si la restricción se realiza en UIScrollView, la vista se perderá y se debe actualizar su marco. Sin embargo, no hay advertencias ni errores. Porque todas las restricciones están en contra de la vista de contenido.
UIScrollView calculará el tamaño de la vista de contenido de acuerdo con las restricciones de las vistas internas. (Por ejemplo, el tamaño del contenido: ancho = 100 (espacio inicial) + 200 (ancho de vista) + 500 (espacio posterior), alto = 131 (espacio superior) + 200 (alto) + 269 (espacio inferior)
Cómo agregar restricciones para vistas en UIScrollView:
- Imagine las posiciones de las vistas en la vista de contenido.
- Agregue el espacio superior, derecho, inferior, izquierdo a los bordes de la vista de contenido, además, también el ancho y alto de estas vistas.
Y todo está hecho.
Una manera fácil de manejar AutoLayout con scrollview es agregar una vista de contenedor que contenga todas las subvistas en la vista de desplazamiento.
Conclusión: el punto clave para entender AutoLayout con UIScrollView es que las vistas internas crean restricciones contra la vista de contenido, pero no contra UIScrollView.
código de ejemplo adjunto
Hay una pieza en las notas técnicas que puede haber revisado. Puede establecer implícitamente el tamaño de contenido de una vista de desplazamiento utilizando restricciones fijadas a los bordes de la vista de desplazamiento.
Aquí hay un ejemplo simple. Cree un guión gráfico con una vista, que tenga una vista de desplazamiento. Establezca las restricciones de las vistas de desplazamiento para que se ajuste al tamaño de la vista en la que lo colocó.
Dentro de esa vista de desplazamiento, agregue una sola vista. Establezca explícitamente el tamaño de esa vista mediante restricciones (y asegúrese de que el tamaño sea más grande que la vista de desplazamiento).
Ahora agregue cuatro restricciones más a esa vista interna que bloquea los cuatro bordes de la vista interna a su vista de desplazamiento principal. Esas cuatro restricciones harán que el tamaño del contenido se expanda para acomodar la vista interna.
Si tiene varias vistas que desea agregar a una vista de desplazamiento, por ejemplo, dispuestas horizontalmente, debe bloquear el lado izquierdo de la primera subvista a la izquierda de la vista de desplazamiento, bloquear las subvistas entre sí horizontalmente y la derecha lado de la última subvista al lado derecho de la vista de desplazamiento. Esas limitaciones obligarían a expandir el tamaño del contenido de la vista de desplazamiento para acomodar todas las subvistas y sus restricciones.
LOL bienvenido al club de estupidez. Soy uno de los fundadores. :RE
Para el desplazamiento VERTICAL : la única forma en que podía hacer que funcionara (iOS 8, Xcode 6 y autodiseño puro) agregaba las siguientes restricciones a mi Vista de desplazamiento (todas relacionadas con la supervista):
- Anchos iguales
- Alturas iguales
- Alineación del centro Y
- Alineación del centro X
Mi estructura
UIView
- ScrollView
- Subview
- Subview
- Subview
- Subview
- ...
Este es el resultado final:
Esta es la configuración:
Con suerte, esto podría salvar a alguien de IR A DORMIR A LAS 5 AM. :RE
La siguiente solución funcionó para scrollView con autolayout y sin contentSize :
- Arrastre y suelte un scrollView para ver el controlador y aplique las restricciones para cubrir el espacio que desee.
- Arrastra y suelta una UIView dentro de scrollView y haz que cubra todo el espacio de scrollView y aplica restricciones para que sean el espacio superior, izquierdo, derecho e inferior de scrollView.
- Establezca la altura (y el ancho si se requiere desplazamiento horizontal) de la vista interna según la necesidad de desplazarse. Esta parte también se puede hacer desde el código si es necesario.
- Crítico . Después de establecer la altura en un valor grande en el punto (3), regrese al punto (2) y asegúrese de establecer los valores superior, izquierdo, derecho e inferior en cero ya que Xcode puede haberlos cambiado por usted cuando fuerza cambió la altura en (3).
Y tu estas listo. Ahora, puede agregar cualquier número de controles en esta vista y aplicar las restricciones relevantes entre sí (que no parecen funcionar sin esta vista). Si no desea utilizar esta vista, deberá aplicar restricciones para cada control relacionado con scrollView (no relacionado entre sí).
El abrumador consejo ..............
Crítico . Digamos por claridad que UIScrollView tiene 1000 de ancho y 100 de alto. (De hecho, normalmente estos valores serían dinámicos, por supuesto, dependiendo del ancho del dispositivo, etc. Pero por ahora solo digamos 1000 de ancho y 100 de alto). Digamos que estás haciendo un desplazamiento horizontal. Así que ponga una UIView dentro de UIScrollView. (Esa es la "vista de contenido"). Establezca las cuatro restricciones de la vista de contenido superior, inferior, inicial, posterior, en la vista de desplazamiento. Haz que sean todos cero, incluso si eso parece estar mal. Establezca el alto del contenido UIView en 100 y olvídese de eso. Ahora: desea desplazarse horizontalmente, por lo que debe establecer el ancho de la vista de contenido, digamos 1225.
Tenga en cuenta que el ancho de la vista de contenido ahora es 225 más grande que el ancho de la vista de desplazamiento principal. Está bien: de hecho, DEBES hacer eso. Tenga en cuenta que
... NO establece el ancho de salida en negativo 225 ...
pensarías que tienes que "combinar" el ancho como lo harías normalmente . Pero si haces eso, no funcionará en absoluto.
Debe establecer los números inicial y final en CERO , nunca negativos (aunque el ancho sea "más grande")
Curiosamente, puede establecer los números iniciales / finales a cualquier valor positivo (intente decir "50") y le da un margen de rebote. (A menudo se ve genial: pruébelo.) Cualquier valor negativo en cualquiera de los extremos se "romperá silenciosamente".
Tenga en cuenta que, exasperante, a menudo Xcode (a partir de 7.3.1 de todos modos),
¡''amablemente'' establecerá esos valores para usted en números negativos!
porque intenta contarlos automáticamente por ti. Si es así, se romperá silenciosamente. Establezca los cuatro valores a cero en la primera instancia. Y configure el ancho de la vista de contenido mucho más ancho que el "1000" en el ejemplo.
Editado: Terminé usando UITableView en lugar de UIScrollView para la mayoría de mis requisitos. Como TableView me parece mucho más flexible y dinámico.
Pasé varios días tratando de encontrar una solución para utilizar AutoLayout y ver una vista de desplazamiento incrustada, para centrar la vista de desplazamiento en la pantalla visible, que funciona en todos los dispositivos / dimensiones de la pantalla y también con la rotación de la pantalla.
Pasé días intentando hacerlo solo con Autolayout, y me acerqué pero nunca lo suficientemente cerca. Así que al final tuve que agregar 3 líneas de código por pantalla también, en viewDidLoad.
Vea la solución a continuación:
- Crea la vista de desplazamiento y llénala con los objetos que quieras
- Activar el diseño automático
- Luego, centre el ScrollView vertical y horizontalmente
- Seleccione la Vista y luego ''Agregar restricciones faltantes'' - esto hace su cosa
- El resultado es que se generan muchas restricciones. Hay 2 nuevos creados para la vista: ''Horiz space scrollview to View'' y ''Vert space scrollview para ver'' o viceversa.
- Elimina la vista de desplazamiento espacial de Horiz a Ver, por lo que ahora te quedan 3 restricciones en la vista. El 2 para ingresar la vista de desplazamiento en la vista y el de establecer un espacio vertical entre la vista de desplazamiento y la vista
- Ahora vincula la restricción Vert a tu código haciendo clic y Ctrl arrastrándolo al archivo de encabezado y creando un NSLayoutConstraint IBOutlet (invoqué la restricción minertVertVtoSV)
Ahora vaya al archivo .m y agregue estas líneas de código a viewDidLoad (juegue con la cantidad de relleno para obtener el vert verting correcto)
if (IPAD)
{self.constraintVertVtoSV.constant = 150.0; }
esto debería ejecutarse ahora en todos los dispositivos y estar centrado correctamente y aún desplazarse correctamente.
Problema similar que estoy teniendo hoy con iOS 8.4, Xcode 6.4
Hay una vista que contiene una vista de desplazamiento, que contiene un contenido (UIView) que contiene subvistas.
Todo es diseño automático en todas partes. Los bordes de la vista de desplazamiento están anclados a los bordes de las vistas principales con restricciones. Los bordes de la vista de contenido están anclados a los bordes de la vista de desplazamiento con restricciones.
Originalmente, la vista de contenido se negaría a clasificar como el ancho completo de la vista de desplazamiento. Tuve que agregar una restricción adicional en la vista de contenido para que su ancho coincida con la vista de desplazamiento principal. O podría establecer una restricción contentView.centerX == scrollView.centerX. O bien uno de esos, además de fijar los bordes de repente hizo que el contenido se vea correctamente.
// Either one of these additional constraints are required to get autolayout to correctly layout the contentView. Otherwise contentView size is its minimum required size
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))
Fijar los bordes de la vista de contenido a la vista de desplazamiento usando restricciones visuales de la forma,
let cvConstraints = ["H:|[contentView]|", "V:|[contentView]|"]
Utilizo una rutina para iterar a través de la matriz y agregarlos a scrollView.
Sé que esta es la solución de un profano y no lo que Apple sugiere en el documento, pero funcionó para mí dos veces, con contenido diferente y se puede configurar muy rápidamente: en el controlador de vista del guión gráfico, inserte UIView. En UIView, inserte una vista de tabla, dinámica, 0 celdas de prototipo, estilo simple o agrupado. En la Vista de tabla, inserte una Vista de desplazamiento, en la Vista de desplazamiento inserte contenido. Eso es todo, no hay configuraciones en el controlador de vista personalizada.
Si su pregunta es "¿Cómo coloco un montón de UITextFields en un UIScrollView de desplazamiento vertical tal que se salgan del camino del teclado cuando tienen foco?", La mejor respuesta es:
No lo hagas
Use un UITableViewController con celdas estáticas en su lugar.
Obtiene este comportamiento de desplazamiento de manera gratuita, Y todas las inserciones de contenido funcionan si su controlador de visualización se muestra dentro de un UINavigationController.
Si, como yo, solo usas contenido estático sin counstraints dentro de la subvista, como puedes hacer de esta manera:
override func viewDidLayoutSubviews() {
scrollView.contentSize = CGSizeMake(320, 800)
}
Supongo que te encuentras con problemas con contentSize
. Consulte esta publicación en el blog sobre cómo manejar el contentSize
del contentSize
cuando se utiliza un enfoque de AutoLayout "puro". La esencia de esto es que sus restricciones implícitamente definen el tamaño del contenido. NUNCA lo estableces explícitamente cuando usas AutoLayout. Adjunté un proyecto de ejemplo al final de la publicación del blog para demostrar cómo funciona
Rápidamente puede usar esta solución de trabajo.
Contraints
ScrollView
: Leading, Trailing, Top, Bottom = Superview
ContentView
: Leading, Trailing, Top, Bottom = ScrollView. Altura fija / relativa al contenido.
Puede establecer la restricción de ancho (contentView) en la supervista de scrollviews igual, pero seleccione eliminar eliminar en tiempo de compilación porque va a agregar esa restricción mediante programación. Esto es solo para que el IB no se queje con advertencias.
extension UIView {
func setupContentViewForViewWithScroll(contentView vwContent : UIView) {
//Set constraint for scrollview content
let constraint = NSLayoutConstraint(item: vwContent, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.bounds.size.width)
vwContent.addConstraint(constraint)
self.layoutSubviews()
}
}
Y en el controlador de vista viewDidLayoutSubviews
simplemente llamo a este método:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.view.setupContentViewForViewWithScroll(contentView: vwContent)
}