framework español iphone cocoa-touch ios4

iphone - español - cocoa framework



UITextView en una UITableViewCell suaviza automáticamente el tamaño (2)

Tengo una UITextView en una vista de contenido de UITableViewCell y dejo que la celda se autoevalúe para que el texto ingresado se muestre por completo. Lo que intento lograr es una celda de conversión automática como la aplicación nativa de Contactos iOS4, cuando ingresas "notas" de contacto. es decir, cuando el tamaño del contenido de textView cambia - Llamo a reloadRowsAtIndexPaths y en height del paradeForRowAtIndexPath del delegado proporciono la nueva altura para la fila - esto hace el trabajo, sin embargo, no es agradable y sin problemas como la aplicación del contacto - estoy casi seguro de que Apple usa algunos indocumentados truco en esa aplicación para hacer que el contenido de la celda se expanda suave y animado sin llamar a reloadRowsAtIndexPaths. Mi pregunta es ¿cómo sugeriría implementar tal funcionalidad? Espero no haber perdido ningún detalle en la explicación.


Pruebe este código a continuación, será de ayuda. No tiene que usar ninguna función de recarga como reloadRowsAtIndexPaths.

// delegado de textview

- (void)textViewDidChange:(UITextView *)textView { if (contentView.contentSize.height > contentRowHeight) { contentRowHeight = contentView.contentSize.height; [theTableView beginUpdates]; [theTableView endUpdates]; [contentView setFrame:CGRectMake(0, 0, 300.0, contentView.contentSize.height)]; } }

// delegado de tableview

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGFloat height; if (indexPath.row == 0) height = kTitleRowHeight; else height = contentRowHeight; return height; }


Encontré la mejor manera de resolver esto.

En primer lugar, por supuesto, querrá crear su UITextView y agregarla al contentView de su celda. Creé una variable de instancia de UITextView llamada "cellTextView" Aquí está el código que utilicé:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"]; if (!cellTextView) { cellTextView = [[UITextView alloc] initWithFrame:CGRectMake(5.0, 5.0, cell.bounds.size.width - 30.0, cell.bounds.size.height - 10.0)]; // I use these x and y values plus the height value for padding purposes. } [cellTextView setBackgroundColor:[UIColor clearColor]]; [cellTextView setScrollEnabled:FALSE]; [cellTextView setFont:[UIFont boldSystemFontOfSize:13.0]]; [cellTextView setDelegate:self]; [cellTextView setTextColor:[UIColor blackColor]]; [cellTextView setContentInset:UIEdgeInsetsZero]; [cell.contentView addSubview:cellTextView]; return cell; }

Luego, crea una variable int llamada numberOfLines y configura la variable a 1 en tu método init. Luego, en el método textViewDidChange de su texto ViewDelegate, use este código:

- (void)textViewDidChange:(UITextView *)textView { numberOfLines = (textView.contentSize.height / textView.font.lineHeight) - 1; float height = 44.0; height += (textView.font.lineHeight * (numberOfLines - 1)); CGRect textViewFrame = [textView frame]; textViewFrame.size.height = height - 10.0; //The 10 value is to retrieve the same height padding I inputed earlier when I initialized the UITextView [textView setFrame:textViewFrame]; [self.tableView beginUpdates]; [self.tableView endUpdates]; [cellTextView setContentInset:UIEdgeInsetsZero]; }

Finalmente, pegue este código en su método heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { float height = 44.0; if (cellTextView) { height += (cellTextView.font.lineHeight * (numberOfLines - 1)); } return height; }