tutorial que framework ios objective-c cocoa-touch uikit iphone-sdk-2

ios - que - cocoa touch tutorial



¿Cómo envuelvo el texto en una UITableViewCell sin una celda personalizada? (9)

Esto es en iPhone 0S 2.0. Las respuestas para 2.1 también están bien, aunque no tengo conocimiento de ninguna diferencia con respecto a las tablas.

Parece que debería ser posible ajustar el texto sin crear una celda personalizada, ya que una UITableViewCell contiene un UILabel de forma predeterminada. Sé que puedo hacer que funcione si creo una celda personalizada, pero eso no es lo que intento lograr, quiero entender por qué mi enfoque actual no funciona.

Me he dado cuenta de que la etiqueta se crea a pedido (ya que la celda admite el acceso a texto e imágenes, por lo que no crea la vista de datos hasta que sea necesario), así que si hago algo como esto:

cell.text = @""; // create the label UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

luego obtengo una etiqueta válida, pero establecer numberOfLines en eso (y lineBreakMode) no funciona, todavía obtengo texto de una sola línea. Hay una gran altura en el UILabel para que se UILabel el texto; solo estoy devolviendo un gran valor para la altura en heightForRowAtIndexPath .


Actualización de la respuesta de Tim Rupe para iOS7:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ; cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:cellText attributes:@ { NSFontAttributeName: cellFont }]; CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil]; return rect.size.height + 20; }


Ahora las tablas pueden tener celdas de auto-tamaño. Establezca la vista de tabla de la siguiente manera

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Referencia de Apple


Aquí hay una manera más simple, y funciona para mí:

Dentro de su función cellForRowAtIndexPath: La primera vez que creas tu celular:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0]; }

Notarás que establezco el número de líneas para la etiqueta en 0. Esto le permite usar tantas líneas como necesite.

La siguiente parte es especificar qué tan grande será su UITableViewCell , así que hágalo en su función heightForRowAtIndexPath :

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellText = @"Go get some text for your cell."; UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0]; CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT); CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap]; return labelSize.height + 20; }

Agregué 20 a la altura de mi celda devuelta porque me gusta un pequeño búfer alrededor de mi texto.


Creo que esta es una solución mejor y más corta. Simplemente formatee UILabel ( textLabel ) de la celda para calcular automáticamente la altura especificando sizeToFit y todo debería estar bien.

- (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]; } // Configure the cell... cell.textLabel.text = @"Whatever text you want to put here is ok"; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; [cell.textLabel sizeToFit]; return cell; }


Encontré que esto es bastante simple y directo hacia adelante:

[self.tableView setRowHeight:whatEvereight.0f];

por ejemplo:

[self.tableView setRowHeight:80.0f];

Este puede o no ser el enfoque mejor / estándar para hacerlo, pero funcionó en mi caso.


No creo que pueda manipular una UITableViewCell''s privada de UILabel de UILabel para hacer esto. Puede agregar una nueva UILabel a la celda usted mismo y usar numberOfLines con sizeToFit para dimensionarla apropiadamente. Algo como:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame]; label.numberOfLines = <...an appriate number of lines...> label.text = <...your text...> [label sizeToFit]; [cell addSubview:label]; [label release];


Si vamos a agregar solo texto en la celda UITableView , solo necesitamos dos delegados para trabajar (no es necesario agregar UILabels adicionales)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Esta solución funcionó para mí:

-(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]; } cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16]; cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; cell.textLabel.text = [mutArr objectAtIndex:indexPath.section]; NSLog(@"%@",cell.textLabel.text); cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGSize labelSize = CGSizeMake(200.0, 20.0); NSString *strTemp = [mutArr objectAtIndex:indexPath.section]; if ([strTemp length] > 0) labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap]; return (labelSize.height + 10); }

Aquí la cadena mutArr es una matriz mutable de la cual mutArr mis datos.

EDITAR: - Aquí está la matriz que tomé.

mutArr= [[NSMutableArray alloc] init]; [mutArr addObject:@"HEMAN"]; [mutArr addObject:@"SUPERMAN"]; [mutArr addObject:@"Is SUPERMAN powerful than HEMAN"]; [mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"]; [mutArr addObject:@"Where are BATMAN and SPIDERMAN"];


Un breve comentario / respuesta para registrar mi experiencia cuando tuve el mismo problema. A pesar de usar los ejemplos del código, la altura de la celda de la vista de tabla se estaba ajustando, pero la etiqueta dentro de la celda todavía no se ajustaba correctamente. La solución era que estaba cargando mi celda desde un archivo NIB personalizado, que ocurre después de ajustar la altura de la celda.

Y tenía mi configuración dentro del archivo NIB para no ajustar el texto, y solo tengo 1 línea para la etiqueta; la configuración del archivo NIB anulaba la configuración que ajustaba dentro del código.

La lección que tomé fue asegurarme de tener siempre en cuenta cuál es el estado de los objetos en cada punto en el tiempo, ¡es posible que aún no se hayan creado! ... hth alguien por la línea.


Yo uso las siguientes soluciones.

Los datos se proporcionan por separado en un miembro:

-(NSString *)getHeaderData:(int)theSection { ... return rowText; }

El manejo se puede hacer fácilmente en cellForRowAtIndexPath . Defina la celda / defina la fuente y asigne estos valores al resultado "celda". Tenga en cuenta que el numberoflines se establece en "0", lo que significa tomar lo que se necesita.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0]; cell.textLabel.text= [self getRowData:indexPath.section]; cell.textLabel.font = cellFont; cell.textLabel.numberOfLines=0; return cell; }

En heightForRowAtIndexPath , calculo las alturas del texto envuelto. El tamaño del boding debe estar relacionado con el ancho de su celda. Para iPad, será 1024. Para iPhone y iPod 320.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0]; CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX); CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap]; return requiredSize.height; }