El único problema que encontré con la respuesta aceptada es que estamos asignando el UITextView cada uno y cada una. Descubrí que esto plantea problemas al tipear en la vista y hacer que el texto se actualice de inmediato y también mantener la vista como primera respuesta. Cuando intenté volver a cargar la celda con la nueva altura, intentaría agregar un nuevo textView.
Debido a esto encontré un método ligeramente diferente para lograr el mismo objetivo. Esperemos que esta toma diferente pueda ayudar a las personas que están luchando por implementar el código anterior.
1) En el archivo de cabecera definir una variable para la altura del texto y el TextView:
UITextView * _textView;
NSInteger _textHeight;
Configuración de una variable significa que podemos cargar la vista a ser una cierta altura si estamos cargando el texto en textView y también reduce la complejidad.
2) cargar la vista de texto y añadirlo a nuestra celda
_textView = [[UITextView alloc] init];
_textView.delegate = self;
_textView.returnKeyType = UIReturnKeyDone;
_textView.font = [UIFont fontWithName:@"Helvetica" size:16];
if (![_user metaStringForKey:bBioKey].length) {
_textView.text = @"Placeholder text";
_textView.textColor = [UIColor lightGrayColor];
}
- (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath == 0) { // Add logic to choose the correct cell
if (_textView.superview != cell) {
[cell addSubview:_textView];
_textView.keepTopInset.equal = KeepRequired(7);
_textView.keepBottomInset.equal = KeepRequired(7);
_textView.keepRightInset.equal = KeepRequired(10);
_textView.keepLeftInset.equal = KeepRequired(70);
}
}
}
}
Usando keeplayout nos ha permitido mantener nuestro campo de texto para permanecer siempre la misma altura que la célula. Además, solo agregamos nuestra UITextView una vez.
3) Agregue el código para calcular la altura del texto
- (NSInteger)getHeightOfBio: (NSString *)text {
UILabel * gettingSizeLabel = [[UILabel alloc] init];
gettingSizeLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
gettingSizeLabel.text = text;
gettingSizeLabel.numberOfLines = 0;
CGSize maximumLabelSize = CGSizeMake(240, 9999); // this width will be as per your requirement
CGSize expectedSize = [gettingSizeLabel sizeThatFits:maximumLabelSize];
return expectedSize.height;
}
He probado muchos y encontró que esto funcione lo mejor
4) Añadir un poco de lógica en la altura de la celda para hacer uso de esta:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0) { // Set the height for our changing textView
return 30 + [self getHeightOfBio:_textView.text];
}
return 44;
}
obvio que necesitamos un poco más de altura que nuestra altura del texto por lo que añade una cantidad amortiguación adicional que puede ser experimentado con.
5) actualizar la vista cada vez que un personaje se escribe para comprobar si tenemos que aumentar el tamaño:
- (void)textViewDidChange:(UITextView *)textView {
if ([self getHeightOfText:textView.text] != _textHeight) {
_textHeight = [self getHeightOfText:textView.text];
[self.tableView beginUpdates];
[self.tableView endUpdates];
}
}
En esta sección obtenemos la altura del texto cada vez que el usuario escribe.
Luego, utilizamos nuestro valor almacenado y comparamos el valor actual con el valor almacenado. Obviamente, si son iguales, no tiene sentido refrescar la vista. Si son diferentes, actualizamos el valor y luego actualizamos nuestra tabla.
Este bit encontré una buena respuesta en stackOverflow que muestra cómo podemos actualizar solo las alturas de la tabla en lugar de la celda misma. ¿Por qué refrescar la celda cuando no es necesario? Esto significa que una vez que esto se llama la altura de la celda se actualiza y aumenta muy bien.
De todos modos, encontré que esto funcionó muy bien y era lo suficientemente simple como para poder juntarlo o tomar partes diferentes y ponerlo en códigos de otras personas.
Apoyos a la respuesta aceptada que fue saqueada por varias piezas en el camino, pero también espero que esta respuesta ayude a algunas personas que están teniendo las mismas dificultades que yo tuve.
sí lo sé eso, pero no sé cómo implementar el "autoresize" de la vista de contenido y de la propia celda :-(¿Tiene algún código de muestra? Gracias. Tony – Tony
Ah, ya veo. No tengo ningún código de muestra. Podría intente volver a cargar solo esa celda cuando el texto se actualice, por lo que la tabla vuelve a calcular la altura. Puede causar problemas porque el campo de texto también lo hace. – Rengers