iOS que diseña UITableViewCell con contenido personalizable

He estado jugueteando con este problema desde hace varios días, y parece que no puedo hacerlo bien.

Estoy intentando build una UITableView que debería ser similar a la siguiente maqueta:

Problema de diseño de iOS

  • Diseño exterior: UITableViewCell
  • Diseño rojo: una UIView de .xib autónoma con una sola UIView
  • Diseño azul: layout interno. Varios de estos deberían poder existir dentro de un solo layout rojo, uno encima del otro, como se describe en la segunda celda.

Esto es, por lo que puedo decir, la forma más óptima de establecer esto en la interfaz de usuario. Sin embargo, no puedo get la altura de la celda (para el método GetHeightForRow), no importa lo que intente.

Cargar y agregar las vistas no es el problema, el problema es después de que se carguen, para llenar los diferentes elementos de la interfaz de usuario con datos y get el tamaño de ellos.

He intentado usar SizeToFit, pero los únicos elementos que parecen tener efecto son UILabels. Incluso cuando el marco de UILabel cambia a algo así como la altura 300 y llamo a SizeToFit en la interfaz de usuario que contiene la label, él (la UIView) aún permanece en 320×100. Lo que significa que cuando se renderiza, se ve todo mal.

La forma en que trato de calcular la altura es muy similar al punto 4 en la respuesta aceptada en https://stackoverflow.com/a/18746930/2520789 . Es decir, crear una sola celda en la memory y completarla con datos para cada fila, y luego get la altura en esa celda.

utilizar esta

 -(CGFloat) heightForText:(NSString *)text withWidth:(CGFloat) textWidth{ CGSize constraint = CGSizeMake(textWidth, 20000.0f); CGRect rect = [text boundingRectWithSize:constraint options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} context:nil]; CGFloat height = rect.size.height; height = ceilf(height); // NSLog(@"height %f", height); return height; } 

Bien . puede lograr el layout deseado siguiendo el método

  1. Agregue una ContentHOlderview a cada celda y haga ping a todo el lado de ContentHolderView a la celda ContentView utilizando el progtwig VFL (lenguaje de formatting visual).

  2. ahora puedes astackr todo dentro de uno por encima de otro programático por VFL.

3. En el método de delegado heightForRowIndex, si la altura de cada elemento xib es fijo, el valor de retorno (que sumrá todos los xib de altura y se calculará al configurar cada celda)

  1. Si la altura de cada xib es dinámica, calcula

altura de cada elemento siguiendo el método mientras configura la celda.

GSize constraint = CGSizeMake (200, 20000.0f); CGRect rect = [Celltext boundingRectWithSize: constraint options: (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading) attributes: @ {NSFontAttributeName: [UIFont systemFontOfSize: 14]} context: nil]; CGFloat height = rect.size.height;

Debe encontrar la altura total de cada celda aplicando la misma lógica para cada subvista.

Mientras leo en tu comentario, no necesitas admitir debajo de iOS 8.0, no necesitas especificar manualmente la altura de la fila. Puede hacerlo de esta manera y cuando use AutoLayout, hará que su altura de layout sea automática.

 this.TableView.EstimatedRowHeight = 600; this.TableView.RowHeight = UITableView.AutomaticDimension; 

¿Y el layout azul dentro del xib rojo? Nunca uso xib antes pero para usar el layout automático necesitas definir el margen inferior y superior en la celda