¿Dimensionando un UILabel para encajar?

¿Cómo se modificaría el siguiente fragmento (en un método tableView: cellForRowAtIndexPath: UITableViewController) de la receta “09a – PrefsTable” del Capítulo 6 del Cookbook del desarrollador de iPhone?

if (row == 1) { // Create a big word-wrapped UILabel cell = [tableView dequeueReusableCellWithIdentifier:@"libertyCell"]; if (!cell) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"libertyCell"] autorelease]; [cell addSubview:[[UILabel alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 280.0f, 330.0f)]]; } UILabel *sv = [[cell subviews] lastObject]; sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; sv.textAlignment = UITextAlignmentCenter; sv.lineBreakMode = UILineBreakModeWordWrap; sv.numberOfLines = 9999; return cell; } 

… dimensionar la subvista UILabel “sv” y la UITableViewCell “celular” para que tengan el tamaño suficiente para que quepan en el texto (y trabajen con más o menos texto y otros tipos de alineación de texto)? Miré el método UILabel textRectForBounds: limitedToNumberOfLines: pero la documentación indica que no se debe invocar directamente (y solo se debe anular). Experimenté con el método UIView sizeToFit, sin éxito.

Actualización: hice una nueva pregunta sobre mi problema con el método NSString -sizeWithFont: forWidth: lineBreakMode : .

Tenía que hacer esto lo suficiente como para haber extendido a UILabel para que lo hiciera por mí:

 @interface UILabel (BPExtensions) - (void)sizeToFitFixedWidth:(CGFloat)fixedWidth; @end @implementation UILabel (BPExtensions) - (void)sizeToFitFixedWidth:(CGFloat)fixedWidth { self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0); self.lineBreakMode = NSLineBreakByWordWrapping; self.numberOfLines = 0; [self sizeToFit]; } @end 

luego tener una etiqueta para tener una altura variable de varias líneas pero un ancho fijo solo:

[myLabel sizeToFitFixedWidth:kSomeFixedWidth];

Debe usar el método de -sizeWithFont:forWidth:lineBreakMode: para recuperar las métricas de tamaño asociadas para su etiqueta.

Además, cambie la propiedad numberOfLines a 0 si va a usar ese código.

NSString ‘s -sizeWithFont:forWidth:lineBreakMode: realidad no realiza la -sizeWithFont:forWidth:lineBreakMode: palabras. En su lugar, use -sizeWithFont:constrainedToSize:lineBreakMode: para obtener un valor preciso de ancho y alto para la cadena.

Prueba esto:

 sv.text = @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; sv.textAlignment = UITextAlignmentCenter; sv.lineBreakMode = UILineBreakModeWordWrap; sv.numberOfLines = 0; [sv sizeToFit]; 

Además, deberá implementar el método UITableViewDelegate:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 

Y devuelve una altura total de celda ajustada para el campo de texto redimensionado.

Otra nota: Ajustar a tamaño debería funcionar, si tiene varias líneas configuradas en 0 como se mencionó anteriormente. Le devolverá un tamaño con la altura aumentada para acomodar el texto envuelto en palabras establecido en la etiqueta y el ancho establecido en el ancho de la etiqueta original.

Eso no te ayudará, ya que necesitas obtener el tamaño en heightForRow antes de que se obtenga la celda, por lo que es mejor calcular la altura necesaria (y muy probablemente almacenar ese cálculo en caché para no ralentizar la representación de la tabla)

Aquí hay un poco de código que uso:

 CGSize textSize = [myLabel.text sizeWithFont:myLabel.font]; 

Tuve un problema similar, tuve una UITableViewCell que fue diseñada en StoryBoards como una celda estática. [super tableView:cellForRowAtIndexPath:] para obtenerlo. Así que quise cambiar el tamaño de UILabel “detailTextLabel” para que se ajuste al texto que le puse. El estilo fue “Detalle correcto”.

Acabo de configurar el texto en mi tableView:cellForRowAtIndexPath: Y que en tableView:heightForRowAtIndexPath: volví

 UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; return cell.detailTextLabel.frame.size.height 

Tenía cuerdas largas. Y finalmente tenía una celda amplia con 4 líneas de texto en la etiqueta.

Tuve un problema similar. Resolví esto.

En el método cellForRowAtIndexPath, establezca el tamaño de fuente a lo que desee.

 cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; cell.textLabel.numberOfLines = 0; [cell.textLabel setFont:[UIFont systemFontOfSize:14.0]]; [cell.textLabel sizeToFit]; 

Y en el método heightForRowAtIndexPath aumenta el tamaño de la fuente.

  CGFloat height; UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; NSString *text = cell.detailTextLabel.text; CGSize constraint = CGSizeMake(320, 20000.0f); CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:20.0] constrainedToSize:constraint lineBreakMode:UILineBreakModeWordWrap]; CGFloat calHeight = MAX(size.height, 44.0f); height = calHeight + (CELL_CONTENT_MARGIN * 2); return height;