2009-01-02 18 views
43

¿Cómo se podría modificar el siguiente fragmento (en un tableView: cellForRowAtIndexPath: Método UITableViewController) de la "09a - PrefsTable" receta del Capítulo 6 del libro de cocina del iPhone Desarrollador:¿Dimensionando un UILabel para encajar?

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; 
} 

... para dimensionar el " sv "La subvista UILabel y la UITableViewCell" celda "deben ser lo suficientemente grandes para ajustarse al texto (y trabajar 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:I asked a new question about my problem with the NSString -sizeWithFont:forWidth:lineBreakMode: method.

+3

+1 de la frase de ejemplo elegida. –

Respuesta

98

que tenía que hacer esto basta con que me ampliado UILabel que lo haga 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 

entonces tener una etiqueta a tener una altura de varias líneas variable, pero una acaba de ancho fijo:

[myLabel sizeToFitFixedWidth:kSomeFixedWidth];

+3

Magia. establece la altura del marco en 0 - luego llama a [self sizeToFit]; Gracias. – johndpope

+0

¿No debería ser mejor establecer los límites en lugar del marco? –

+0

Los límites también pueden funcionar, es solo un cambio para el marco. Como establecí la x y la y en los valores self.frame.origin, se logra lo mismo que self.bounds = CGRectMake (0,0, fixedWidth, fixedHeight), sería bueno si pudieras establecer frame.size propiedad directamente, pero esto no funciona :) – BadPirate

17

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

+0

Kevin, si actualiza su respuesta a - [NSString sizeWithFont: forWidth: lineBreakMode:] Lo aceptaré. –

+0

En breve, debe usar el método 'sizeWithAttributes' – alcamla

10

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

2

Además, tendrá que poner en práctica el método UITableViewDelegate:

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

y haga que sea devolver una altura total de células ajustado por el campo de texto cambia de tamaño.

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 lo ayudará, ya que necesita obtener el tamaño en heightForRow antes de obtener 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)

5

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

+0

Acabo de ver el enlace a su otra pregunta. Parece que lo tienes justo allí, lo siento por el idiota. – pix0r

4

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]; 
1

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

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

Tuve un problema similar, tuve una UITableViewCell que se diseñó en StoryBoards como una celda estática. Usé [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 

tuve cadena larga. Y finalmente tenía una celda amplia con 4 líneas de texto en la etiqueta.

0

Tuve un problema similar. Lo resolví.

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 aumentar 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;