working not uitableview autolayout ios8

not - Auto dimensionamiento de iOS 8 UITableViewCell con UITextView



uitableviewautomaticdimension (5)

iOS 8 introdujo una manera para que las TableViews ajusten automáticamente la altura de sus celdas en función de su contenido (a través de AutoLayout).

// in viewDidLoad: tableView.rowHeight = UITableViewAutomaticDimension tableView.estimatedRowHeight = 44.0

Ya lo tengo trabajando con etiquetas, imágenes, etc.

Sin embargo, ¿no puedo encontrar una manera para que la celda de vista de tabla crezca automáticamente tan pronto como cambie la vista de texto de una celda?

Un poco más de información sobre la configuración: El UITextView dentro de una celda tiene restricciones horizontales y verticales al contenidoView de la celda de la vista de tabla. También deshabilité el desplazamiento para la vista de texto.

También he intentado cambiar la restricción de altura de la celda manualmente, pero la celda tampoco adoptará esos cambios.


Debes deshabilitar el desplazamiento desde tu UITextView


Esta es la función que uso, que resuelve el problema de la vista de tabla que se recupera después de cada pulsación de tecla.

- (void)textViewDidChange:(UITextView *)textView { CGFloat fixedWidth = textView.frame.size.width; CGSize oldSize = textView.frame.size; CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; // Resize cell only when cell''s size changes, to prevent bouncing back and forth. if (oldSize.height != newSize.height) { [UIView setAnimationsEnabled:NO]; CGRect newFrame = textView.frame; newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height); textView.frame = newFrame; [self.tableView beginUpdates]; [self.tableView endUpdates]; [UIView setAnimationsEnabled:YES]; } }


Recargue la celda en el método textViewDidBeginEditing: de su UITextViewDelegate

[self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates];

Obviamente, deberías cambiar la ruta del índice a la correcta para tu celda. Esto hará que la celda actualice sus restricciones y cambie su tamaño.


Si todo está configurado correctamente (restricciones de diseño automático) no tiene que calcular nada por sí mismo .

Todo lo que tiene que hacer es deshabilitar la propiedad habilitada para el desplazamiento de UITextView luego en textViewDidChange llamar a tableView.beginUpdates() y tableView.endUpdates() .

Para una explicación detallada, echa un vistazo a una publicación que escribí, que también incluye un proyecto de muestra de trabajo.


Solución para Swift 4

func textViewDidChange(_ textView: UITextView) { let fixedWidth = textView.frame.size.width let oldSize = textView.frame.size let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))) if oldSize.height != newSize.height { UIView.setAnimationsEnabled(false) var newFrame = textView.frame newFrame.size = CGSize(width: fmax(newSize.width, fixedWidth), height: newSize.height) textView.frame = newFrame self.tableView.beginUpdates() self.tableView.endUpdates() UIView.setAnimationsEnabled(true) } }