iphone - ¿Cómo hacer una UITableViewCell con una UITextView adentro, que ajuste dinámicamente su altura, sobre la base de UITextView?
(10)
Al mirar esto, necesitas ser un poco complicado. Necesita calcular la altura del textView de forma dinámica y, en función de la altura del TextView, debe devolver el alto para la celda.
Es muy fácil y algo complicado.
Este es el código por el cual puedes calcular el tamaño de la secuencia ....
Primero obtén el tamaño de String
NSString *label = @"Sample String to get the Size for the textView Will definitely work ";
CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15]
constrainedToSize:CGSizeMake(320, 9999)
lineBreakMode:UILineBreakModeWordWrap];
over here ....
NSLog(@"%f",stringSize.height);
En segundo lugar, crea dinámicamente la vista de texto en la celda ... ofreciendo el valor de cadena.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
//}
NSDictionary *d=(NSDictionary *)[self.menuArray objectAtIndex:indexPath.section];
NSString *string = [d valueForKey:@"Description"];
CGSize stringSize = [string sizeWithFont:[UIFont boldSystemFontOfSize:15] constrainedToSize:CGSizeMake(320, 9999) lineBreakMode:UILineBreakModeWordWrap];
UITextView *textV=[[UITextView alloc] initWithFrame:CGRectMake(5, 5, 290, stringSize.height+10)];
textV.font = [UIFont systemFontOfSize:15.0];
textV.text=string;
textV.textColor=[UIColor blackColor];
textV.editable=NO;
[cell.contentView addSubview:textV];
[textV release];
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
NSDictionary *d=(NSDictionary *)[self.menuArray objectAtIndex:indexPath.section];
NSString *label = [d valueForKey:@"Description"];
CGSize stringSize = [label sizeWithFont:[UIFont boldSystemFontOfSize:15]
constrainedToSize:CGSizeMake(320, 9999)
lineBreakMode:UILineBreakModeWordWrap];
return stringSize.height+25;
}
Después de dar tanto dolor a mis dedos, ...... Creo que esto es suficiente código ... y seguramente ayudará a resolver su problema ...
Buena suerte
Me gustaría tener una vista de tabla con un comportamiento similar a la aplicación Contactos de Apple de Apple: una celda de uitableview con una vista de uitext dentro, de modo que cuando escribo en la vista de uitext, la uitextview aumenta su altura, por lo que la uitableviewcell ajusta dinámicamente su altura. ¡Busqué en toda la web, buscando solo soluciones parciales y falta de código de muestra!
por favor ayudame estoy desesperado
Tony
Chicos esto es realmente genial, pero pueden usar tableview: didSelectRowForIndexPath: para agregar el UITextView a la celda como subvista cuando el usuario lo toca, funciona muy bien ya que solo necesita usar 1 UITextView que puede reutilizar y no interferirá. con la mesa de visitas recibiendo toques! Suelta cuando haya terminado.
Detalles? ¡solo pregunta!
Cree una UITableViewCell personalizada y agregue su UITextView al contentView de la celda.
En LayoutSubviews, establezca textView.frame en contentView.bounds de la celda (o haga otro diseño personalizado).
Cuando los contenidos de textView cambian (descubiertos a través de UITextViewDelegate), haga dos cosas:
1) llame a [tableView beginUpdates]; [tableView endUpdates];
[tableView beginUpdates]; [tableView endUpdates];
Esto obligará a la vista de tabla a volver a calcular la altura para todas las celdas (llamará a tableView:heightForRowAtIndexPath:
. Si su celda es la delegada de textView, entonces tendrá que descubrir cómo obtener un puntero a tableView, pero hay algunas maneras de lograrlo. O podrías hacer que el delegado sea tu controlador de vista ...
2) cuando se tableView:heightForRowAtIndexPath:
return the textView.contentSize.height
. Puede obtener su celda desde aquí llamando a [tableView cellForRowAtIndexPath];
O si solo tiene una de estas celdas, guarde en ella un puntero en su viewController.
Debe devolver la altura correcta en el método delegado heightForRowAtIndexPath.
Edito la respuesta de TomSwift, que es la mejor manera de hacerlo:
aquí está mi código de celda (en breve)
class CommentaireTextViewCell: UITableViewCell,UITextViewDelegate {
@IBOutlet weak var textViewCom: UITextView!
weak var parentTableView:UITableView?
@IBOutlet weak var constraintTextViewTopMargin: NSLayoutConstraint!
@IBOutlet weak var constraintTextViewHeight: NSLayoutConstraint!
@IBOutlet weak var constraintTextViewBottomMargin: NSLayoutConstraint!
override func awakeFromNib() {
self.textViewCom.delegate = self;
}
func textViewDidChange(textView: UITextView) {
self.parentTableView?.beginUpdates();
self.parentTableView?.endUpdates();
}
func getHeight() -> CGFloat
{
constraintTextViewHeight.constant = self.textViewCom.contentSize.height;
// cell height = textview marge top+ textview height+ textView Marge bottom
return constraintTextViewTopMargin.constant+constraintTextViewHeight.constant+constraintTextViewBottomMargin.constant+8
// add 8 because it seems to have an inset inside the textView
}
override func setSelected(selected: Bool, animated: Bool) {
self.textViewCom.becomeFirstResponder();
}
}
para la explicación, la vista de la tabla de celdas es una propiedad débil de la celda, así que puedo decir que actualice el diseño cuando el usuario ingrese el texto. La altura de la celda es la suma de su restricción superior para contentView, su restricción inferior para contentView y textView.contantSize.height, que también es igual a la altura constante textView.
El único problema que encontré con la respuesta aceptada fue que estamos asignando el UITextView todas y cada una de las veces. 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 encabezado defina una variable para la altura del texto y la vista de texto:
UITextView * _textView;
NSInteger _textHeight;
Establecer una variable significa que podemos cargar la vista para que tenga cierta altura si estamos cargando texto en textView y también reduce la complejidad.
2) Cargue la vista de texto y agréguela 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);
}
}
}
}
El uso de keeplayout nos ha permitido mantener nuestro campo de texto para mantener siempre la misma altura que la celda. 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 he encontrado que esto funciona mejor
4) Agregue un poco de lógica en la altura de la celda para hacer uso de esto:
- (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;
}
Obviamente, necesitamos un poco más de altura que la altura de nuestro texto, así que agregué una cantidad adicional de cojín con la que se puede experimentar.
5) Actualice la vista cada vez que escriba un carácter para verificar si necesitamos 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, aunque usemos nuestro valor almacenado y comparemos 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 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, me pareció que funcionaba muy bien y era lo suficientemente simple como para juntarlo o tomar partes diferentes y ponerle 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.
Finalmente lo hice funcionar. El principal problema es cómo obtener el contentView
la celda para contentView
el ancho correcto. El ancho de codificación no funciona para todos los casos, ya que puede variar según el estilo de tabla simple / agrupada, los accesorios añadidos o el diseño de paisaje / retrato. La única forma de obtener el 100% de ancho correcto es preguntándolo desde el objeto de celda. Así que creo una celda en heightForRowAtIndexPath
y la heightForRowAtIndexPath
en caché, luego esta celda en caché será devuelta por el método cellForRowAtIndexPath
. Otro problema es cómo forzar a la célula a diseñar sus subvistas antes de que se use. Se puede hacer si agregamos temporalmente la celda a tableView
y actualizamos el marco de la celda con el ancho de tabelView
. Después de eso, todas las subvistas se presentarán de la manera correcta. Here es cómo lo conseguí trabajando en mi biblioteca de TableKit .
He escrito mis aprendizajes y la solución para calcular la altura de UITableViewCell basada en una UITextView interna en mi blog. La publicación contiene el código que funciona para aplicaciones universales, tanto estilos de vista de tabla como autorrotación.
Pruebe el siguiente código:
CGSize constraintSize;
constraintSize.height = MAXFLOAT;
constraintSize.width = yourTextView.frame.size.width;
NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
[UIFont fontWithName:@"yourFontName" size:yourFontSize], NSFontAttributeName,
nil];
CGRect frame = [yourTextView.text boundingRectWithSize:constraintSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributesDictionary
context:nil];
CGSize stringSize = frame.size;//The string size can be set to the UITableViewCell
puede obtener el tamaño de UITextView mediante programación.De acuerdo con el tamaño, configure la altura de la celda con el siguiente delegado
tableView:heightForRowAtIndexPath: