iOS – Redibujar TableViewCells con alturas de celda dinámica en rotation

¿Cómo puedo hacer que vuelvan a dibujar mis células una vez que el dispositivo gira?

Cuando estoy probando en iPhone, la orientación pnetworkingeterminada es vertical, por lo que mis celdas dinámicas son tan altas como deben ser cuando el dispositivo está en orientación vertical: esto significa que cuando giro a paisaje, hay un montón de espacio vacío en el celda. Cuando pruebo en iPad, es todo lo contrario. Recibo parte de mi text cortado al girar a la orientación vertical, ya que el valor pnetworkingeterminado es horizontal. Tengo storyboards separados para ambos dispositivos, y ambos controlleres de vista están configurados en "Orientación: Infernetworking"

introduzca la descripción de la imagen aquí (Retrato) introduzca la descripción de la imagen aquí (Paisaje)

Esto es lo que está sucediendo en el iPhone: la label de estiramiento tiene un background rojo oscuro para que pueda ver el tamaño real de la label. Sin embargo, la altura de la celda no se está recalculando y dado que las tags inferiores están restringidas al background de la celda, están completamente en el background por sí mismas. Si agrego una restricción de la label de estiramiento (la que tiene el background) al background de la celda, todo lo que hace es estirar la label de la siguiente manera:

introduzca la descripción de la imagen aquí (La label se estira)

Lo que esto me dice es que ahora mismo no puedo hacer que la célula sepa cuál es la orientación y volver a dibujar una vez que cambie para adaptarse. Aquí está mi código heightForRowAtIndexPath que calcula la altura de la celda:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { if (!self.opCell) { self.opCell = [self.container dequeueReusableCellWithIdentifier:@"OPCell"]; } self.opCell.opName.text = [[self.data objectAtIndex:indexPath.row] valueForKey:@"name"]; [self.opCell layoutIfNeeded]; CGFloat height = [self.opCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height; return height + 1; } 

Hasta ahora para hacer que gire he intentado [self.container reloadData] , donde el contenedor es mi TableView con willRotateToInterfaceOrientation y didRotateToInterfaceOrientation en vano. También traté de ponerlo en viewDidLoad, para poder detectar y cargar cuando la vista se cargó en modo horizontal con la altura correcta, pero tampoco funcionó. Para iPhone, no importa lo que hago, carga la altura para la vista vertical y no se actualiza en rotation.

He encontrado algunas preguntas que pensé que podrían ayudar, pero parece que esta respuesta no me funciona, aunque parece ser la misma pregunta que tengo, y esta parece centrarse más en el ancho de la celda que en la altura y No estoy seguro de que se aplique de la misma manera.

Aquí hay incluso un tutorial que, cuando lo ejecuté en el iPhone, tampoco cambia el tamaño de las TableViewCells en rotation.

Este tutorial parecía tener alguna idea de cambiar las alturas de la tabla, así que agregué el código begin/endUpdates en my didRotateToInterfaceOrientation , pensando que podría causar un cambio, pero esto no funcionó tan bien.

Por lo tanto, si alguien tiene alguna sugerencia o sabe una solución, sería muy apreciado, ¡ya que estoy golpeando una panetworking de ladrillos con esta!

Parece que estás haciendo un resumen de palabras aquí. Entonces, según mi experiencia previa, te sugiero que:
1) use sizeWithFont o la versión más reciente de iOS7 con el modo linebreak apropiado.
2) Puede implementar layoutSubview para su "opCell" donde puede networkingefinir el tamaño del marco.
3) Calcule la altura de la celda durante la rotation … asegúrese de configurar correctamente el ancho según los nuevos tabelView Bounds.
4) También puede implementar estimatedHeightForRowAtIndexPath para el tamaño estimado rápido para la operación de recarga de tablas.

Espero que esto ayude !!

Entonces me di count de mi problema. Siguiendo este tutorial descubrí que me estaba perdiendo.

Tuve que:

  1. Subclass mi label que estaba estirando y declara que prefernetworkingMaxLayout cumple con el ancho de la pantalla

  2. En my heightForRowAtIndexPath , necesito decirle a la celda que obtenga y actualice el ancho actual de la pantalla

Vea el tutorial para más detalles. Espero que esta pregunta y respuesta ayude a alguien en el futuro, porque esto fue extremadamente problemático.

Podrías usar el mismo truco que aquí . Eso es llamar:

 [tableView beginUpdates]; [tableView endUpdates]; 

Sin nada intermedio. Esto activará un nuevo recálculo para la vista de tabla.