bar - iOS ScrollView necesita restricciones para la posición y altura
status bar ios (6)
- Seleccione su controlador de vista
- Desmarque ''Ajustar las configuraciones de la vista de desplazamiento''
-ViewController
--View
---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0)
----ContentView (Top,Bottom,Leading,Trailing spaces to superview set to 0, Width equals with View (ViewController''s child))
-----Label1
-----etc...
Si configuro una restricción de altura específica para mi vista de contenido (por ejemplo, 1000) ScrollView funciona bien, pero obtuve un ContentView de 1000 estático, que no es mi objetivo, porque mi contenido obtuvo contenido dinámico, por lo que debería ser el alto del contenido necesariamente.
Si elimino la restricción de altura para mi ContentView, Xcode dice:
Missing Constraints:
ScrollView need constraints for: Y position or height
ScrollView está fijado en la parte superior e inferior, por lo que no sé por qué Xcode quiere una restricción de altura para ScrollView ...
¿Cómo es el camino correcto cuando quiero que la altura de ContentView sea la altura que necesita el contenido?
Asegúrese de que el elemento más al fondo dentro de su vista de contenido dentro de su vista de desplazamiento tenga la restricción de espacio inferior establecida en 0 y asegúrese de que todos los elementos dentro de la vista de contenido tengan la altura establecida.
Esto hace que la vista de contenido cambie de tamaño según los elementos que contiene y no tiene la altura fija de la vista de desplazamiento / vista de contenido y la vista de desplazamiento cambiará de tamaño con el tamaño de pantalla del teléfono.
Funcionará
-ViewController
--View
---ScrollView (Top,Bottom,Leading,Trailing spaces to superview set to 0)
----ContentView (Top,Leading,Trailing spaces to ScorllView set to 0 | Height to dynamic (1000))
-----Label1
-----etc...
Haga lo mismo con su ContentView, su propio cálculo para su contenido
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:YES];
[self adjustHeightOfTableview];
}
- (void)adjustHeightOfTableview
{
CGFloat height = tblMainMenu.contentSize.height;
CGFloat maxHeight = tblMainMenu.superview.frame.size.height - tblMainMenu.frame.origin.y;
// if the height of the content is greater than the maxHeight of
// total space on the screen, limit the height to the size of the
// superview.
if (height > maxHeight)
height = maxHeight;
// now set the height constraint accordingly
self.tableViewHeightConstraint.constant = height;
[UIView animateWithDuration:0.1 animations:^{
[self.view setNeedsUpdateConstraints];
}];
}
Editar 1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSString *OptName_length = @" Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam";
NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:17.0]};
CGRect rect = [OptName_length boundingRectWithSize:CGSizeMake(tableView.bounds.size.width-150.0, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil];
CGSize requiredSize = rect.size;
return requiredSize.height +5.0f;
}
Editar 2
Comprueba el sitio, esto te ayudará ... uitableviewcell-dynamic-height-with-autolayout-conclusion
La respuesta de Bharat Modi soluciona bastante el problema, pero yo (Xcode 8.3.2, iOS 10 SDK) también tenía que coincidir con el alto y ancho de la Vista de Contenido para el alto y ancho de UIScrollView.
Esto fijará el tamaño del contenido en el área visible, pero hace feliz a IB. Entonces (creo) solo se trata de calcular correctamente el tamaño del contenido y configurarlo programáticamente. Que de todos modos tendría que haber hecho, ya que si tienes contenido dinámico, solo puedes hacerlo en tiempo de ejecución.
Es posible que también deba modificar las configuraciones "Ajustar las inserciones de la vista de desplazamiento" del controlador de vista si tiene una barra de navegación.
Esto es lo que tengo:
Tenga en cuenta que esto podría ser solo una peculiaridad de mi configuración, ya que las sugerencias oficiales ( https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/WorkingwithScrollViews.html ) tampoco mencionan que esto necesita ser hecho.
Traté de descifrar esto utilizando solo una vista de desplazamiento, una vista de contenido y otra vista ficticia de ancho y alto fijo para imitar el contenido, pero nada parecía alegrar a IB.
(Lo siento, no tengo suficientes representantes para poner esto como comentario en la respuesta original).
ACTUALIZAR:
Así que, en realidad, lo que terminé haciendo es configurar mi Vista de Contenido a una altura fija en IB y crear una salida para esa restricción de altura en el código. Luego, una vez que la vista ha cargado todo su contenido dinámico, simplemente actualizo la restricción de altura de la siguiente manera:
self.uiContentViewHeightConstraint.constant = mapViewBottomY + 15
Y todo funciona La clave aquí es básicamente que cuando hay una vista dentro de una vista de desplazamiento, esa vista define el tamaño del contenido de la vista de desplazamiento. Como se mencionó anteriormente, el tamaño de la vista del contenido debe estar completamente definido en el momento de la compilación para que IB sea feliz. Usted es libre de manipular los valores en tiempo de ejecución a través de puntos de venta, es fácil y seguro.
Una ventaja de tener la vista de contenido en tamaño fijo en IB es que, dado que ha arreglado el tamaño del contenido, las vistas dentro de la vista de contenido ahora pueden definirse como de costumbre, usando compensaciones relativas.
Siempre que utilice ScrollView con diseño automático, siempre siga los pasos a continuación,
Restricciones de ScrollView: leadingSpace, topSpace, TrailingSpace, bottomSpace a superView y asegúrese de que cuando controla el arrastre para agregar restricción, agréguelo presionando alt para que la restricción se establezca sin margen.
Agregue UIView dentro de la vista de desplazamiento como vista de contenido y establezca sus restricciones: leadingSpace, topSpace, trailingSpace, bottomSpace a ScrollView sin presionar el botón alt y establezca equalWidth para ScrollView.
Cualquiera que sea la vista que agregue dentro de esta vista de contenido debe tener una restricción de arriba a abajo, es decir, todas las vistas deben tener una restricción vertical, por lo que contentView puede calcular la altura requerida para sí en función del contenido que contiene.
Si las restricciones están configuradas correctamente, scrollView configurará su tamaño de contenido automáticamente en función del componente que contiene y no necesita establecer manualmente el tamaño del contenido, sino que scrollView solo se desplazará si el componente dentro de la vista del contenedor no se ajusta dentro. de lo contrario, no se desplazará. Si desea hacer que se desplace de todos modos, debe comprobar la propiedad Bounces Vertically del guión gráfico para obtener el efecto de rebote.
Nota: Mientras establece la restricción para el componente dentro de scrollView, verá la advertencia de restricción hasta que configure la restricción desde el componente superior al inferior, sin embargo, recuerde que su componente superior debe tener la restricción superior (restricción vertical) para superView y el el componente en la parte inferior debe tener una restricción de espacio inferior a la supervisión. Cuando esto satisfaga, todas las advertencias desaparecerán eventualmente.
ScrollView restricciones:
Restricciones de ContainerView: