¿Hay alguna manera de hacer un UIScrollView
ajuste automático a la altura (o ancho) del contenido que se desplaza?
Algo como:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
¿Hay alguna manera de hacer un UIScrollView
ajuste automático a la altura (o ancho) del contenido que se desplaza?
Algo como:
[scrollView setContentSize:(CGSizeMake(320, content.height))];
El mejor método que he encontrado para actualizar el tamaño del contenido de un UIScrollView
basado en sus subvistas contenidas:
C objetivo
CGRect contentRect = CGRectZero;
for (UIView *view in self.scrollView.subviews) {
contentRect = CGRectUnion(contentRect, view.frame);
}
self.scrollView.contentSize = contentRect.size;
Rápido
let contentRect: CGRect = scrollView.subviews.reduce(into: .zero) { rect, view in
rect = rect.union(view.frame)
}
scrollView.contentSize = contentRect.size
viewDidLayoutSubviews
para que el autolayout terminara, en iOS7 funcionó bien, pero probar os iOS6 el autolayout por alguna razón no terminó el trabajo, por lo que tenía algunos valores de altura incorrectos, así que cambié aviewDidAppear
ahora funciona bien ... solo para señalar que tal vez alguien necesitaría esto. graciasUIScrollView no conoce la altura de su contenido automáticamente. Debes calcular la altura y el ancho por ti mismo
Hazlo con algo como
Pero esto solo funciona si las vistas son una debajo de la otra. Si tiene una vista una al lado de la otra, solo tiene que agregar la altura de una si no desea establecer el contenido del desplazador más grande de lo que realmente es.
fuente
int y = CGRectGetMaxY(((UIView*)[_scrollView.subviews lastObject]).frame); [_scrollView setContentSize:(CGSizeMake(CGRectGetWidth(_scrollView.frame), y))];
Solución si está utilizando diseño automático:
Establecer
translatesAutoresizingMaskIntoConstraints
aNO
en todas las vistas involucradas.Coloque y dimensione su vista de desplazamiento con restricciones externas a la vista de desplazamiento.
Use restricciones para diseñar las subvistas dentro de la vista de desplazamiento, asegurándose de que las restricciones estén vinculadas a los cuatro bordes de la vista de desplazamiento y no confíe en la vista de desplazamiento para obtener su tamaño.
Fuente: https://developer.apple.com/library/ios/technotes/tn2154/_index.html
fuente
Agregué esto a la respuesta de Espuz y JCC. Utiliza la posición y de las subvistas y no incluye las barras de desplazamiento. Editar Utiliza la parte inferior de la vista secundaria más baja que está visible.
fuente
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
al principio yself.scrollView.showsHorizontalScrollIndicator = YES;
self.scrollView.showsVerticalScrollIndicator = YES;
al final del método?Aquí está la respuesta aceptada rápidamente para cualquier persona que sea demasiado perezosa para convertirla :)
fuente
Aquí hay una adaptación de Swift 3 de la respuesta de @leviatan:
EXTENSIÓN
USO
Muy facil de usar!
fuente
La siguiente extensión sería útil en Swift .
La lógica es la misma con las respuestas dadas. Sin embargo, omite las vistas ocultas
UIScrollView
y el cálculo se realiza después de que los indicadores de desplazamiento se ocultan.Además, hay un parámetro de función opcional y puede agregar un valor de desplazamiento pasando el parámetro a la función.
fuente
Gran y mejor solución de @leviathan. Simplemente traduciendo a Swift usando el enfoque FP (programación funcional).
fuente
self.contentSize = self.subviews.reduce(CGRect(), { $0.union($1.frame) }).size
Puede obtener la altura del contenido dentro de UIScrollView calculando qué hijo "llega más lejos". Para calcular esto, debe tener en cuenta el origen Y (inicio) y la altura del artículo.
Al hacer las cosas de esta manera, los elementos (subvistas) no tienen que apilarse directamente uno debajo del otro.
fuente
Se me ocurrió otra solución basada en la solución de @emenegro
Básicamente, descubrimos qué elemento está más abajo en la vista y agregamos un relleno de 10px en la parte inferior
fuente
Debido a que scrollView puede tener otras scrollViews o diferentes inDepth subViews tree, es preferible ejecutarlo en profundidad de forma recursiva.
Swift 2
Uso
fuente
O simplemente hazlo:
(Esta solución fue agregada por mí como un comentario en esta página. ¡Después de obtener 19 votos positivos para este comentario, he decidido agregar esta solución como una respuesta formal para el beneficio de la comunidad!)
fuente
Para swift4 usando reduce:
fuente
El tamaño depende del contenido cargado dentro de él y las opciones de recorte. Si se trata de una vista de texto, entonces también depende del ajuste, cuántas líneas de texto, el tamaño de fuente, etc. Casi imposible para usted computarse. La buena noticia es que se calcula después de cargar la vista y en viewWillAppear. Antes de eso, todo es desconocido y el tamaño del contenido será el mismo que el tamaño del marco. Pero, en el método viewWillAppear y después (como viewDidAppear), el tamaño del contenido será el real.
fuente
Envolviendo el código de Richy, ¡creé una clase UIScrollView personalizada que automatiza completamente el cambio de tamaño del contenido!
SBScrollView.h
SBScrollView.m:
Cómo usarlo:
simplemente importe el archivo .h a su controlador de vista y declare una instancia de SBScrollView en lugar de la instancia normal de UIScrollView.
fuente
Establezca un tamaño de contenido dinámico como este.
fuente
realmente depende del contenido: content.frame.height podría darte lo que quieres. Depende de si el contenido es una sola cosa, o una colección de cosas.
fuente
También encontré la respuesta del leviatán para trabajar mejor. Sin embargo, estaba calculando una altura extraña. Al recorrer las subvistas, si la vista de desplazamiento está configurada para mostrar indicadores de desplazamiento, estarán en la matriz de subvistas. En este caso, la solución es desactivar temporalmente los indicadores de desplazamiento antes de realizar un bucle y luego restablecer su configuración de visibilidad anterior.
-(void)adjustContentSizeToFit
es un método público en una subclase personalizada de UIScrollView.fuente
Creo que esta puede ser una buena manera de actualizar el tamaño de la vista de contenido de UIScrollView.
fuente
¿Por qué no una sola línea de código?
fuente
fuente