2012-01-11 8 views
11

Necesito hacer celda personalizado en UITableViewStyleGrouped table.It debe mirar como si UITableViewCellStyleValue1 textLabel y detailTextLabel se mostraron sin truncamiento, o como UITableViewCellStyleSubtitle (pero con un ancho detailTextLabel = contentView.frame.size.width y UITextAlignmentRight) si en valor1 el estilo uno de las etiquetas está truncado.¿Cómo se obtiene el ancho de contenido de UITableViewCell?

Necesito saber el ancho de cell.contentView en el método - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath para decidir qué altura debe tener la celda. Yo comparo cell.contentView.width y la suma de anchos de etiquetas (los obtengo usando el método sizeThatFits:) para decidirlo.

Entonces, ¿cómo obtener cell.contentView.frame.size.width correcto antes de la creación de la celda?

UPD: código para aclarar la pregunta.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat cellHeight = 44; 

    CGSize textSize = [[arrayOfTextData objectAtIndex:indexPath.row] 
          sizeWithFont:[UIFont systemFontOfSize:14] 
          constrainedToSize:CGSizeMake(1000, 100) 
          lineBreakMode:UILineBreakModeCharacterWrap]; 
    CGSize detailedTextSize = [[arrayOfDetailTextData objectAtIndex:indexPath.row] 
            sizeWithFont:[UIFont systemFontOfSize:14] 
            constrainedToSize:CGSizeMake(1000, 100) 
            lineBreakMode:UILineBreakModeCharacterWrap]; 
    if (textSize.width + detailedTextSize.width > /* I need here cell.contentView.frame.size.width*/ 300) { 
     cellHeight = textSize.height + detailedTextSize.height; 
    } 
    return cellHeight; 
} 

UPD2: El problema es que cuando se crea la célula cell.contentView.frame.size.width iguales e iguales cell.frame.size.width 320, pero después de células apareció cell.contentView.frame .size.width cambia en dependencia de tableView width y tableView style.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"tmpCell"; 
    CustomTableViewCellValue1OrSubtitle *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[CustomTableViewCellValue1OrSubtitle alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];  
    } 
    //--Configure the cell 
     cell.textLabel.text = [arrayOfTextData objectAtIndex:indexPath]; 
     cell.detailTextLabel.text = [arrayOfDetailTextData objectAtIndex:indexPath.row]; 

    [cell layoutIfNeeded]; 

    CGSize textSize = [cell.textLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode]; 
    CGSize detailedTextSize = [cell.detailTextLabel.text sizeWithFont:cell.textLabel.font constrainedToSize:CGSizeMake(cell.contentView.bounds.size.width, 99999) lineBreakMode:cell.textLabel.lineBreakMode]; 
    CGFloat cellHeight = cell.contentView.frame.size.height; 

    NSLog(@"contentView.frame.size.width = %f",cell.contentView.frame.size.width); 
    //out: contentView.frame.size.width = 320.0 
    //Always print 320, even if I set Simulator on iPad 

    if (textSize.width + detailedTextSize.width > cell.contentView.frame.size.width) { 
     cellHeight = textSize.height + detailedTextSize.height; 
    } 
    return cellHeight; 
} 
+0

¿Alguna vez encontró una solución para esto? Tengo un problema similar donde 'contentView.frame.size.width' devuelve 320 en iPhone durante la inicialización. – cod3monk3y

+1

Terminé implementando 'layoutSubviews' para cambiar el tamaño del contenido de mi celda personalizada. – cod3monk3y

+0

He hecho lo mismo. – Alexander

Respuesta

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

    if (indexPath.section == 0) 
     return 60.0f; 
    else 
     return 50.0f; 

} 

Aplicando esta se puede establecer la celda -> contentView. Y si necesita un ancho de celda dinámico use el indicador en el método anterior

+0

No entendí a qué se refiere. No necesito el ancho de celda dinámico. Quiero saber el ancho de cell.contentView para comprender: ¿las etiquetas se ajustan a la celda sin truncar? Si no, quiero volver en '- (CGFloat) tableView: (UITableView *) tableView heightForRowAtIndexPath: (NSIndexPath *) indexPath' otra altura. – Alexander

4

Si no me equivoco, heightForRowAtIndexPath: se llama antes o justo después de inicializar una celda, por lo que no hay tiempo para cambiar el tamaño.

Esto debería funcionar para usted:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"%f", cell.contentView.frame.size.width); 
} 

Por desgracia, esto se llama después de heightForRowAtIndexPath. La única forma que encontré para ajustar la altura basada en un ancho no constante es establecer una variable de instancia para el ancho la primera vez que se llama este método, luego volver a cargar la vista de tabla y usar la variable de instancia de ancho dentro de heightForRowAtIndexPath.

+1

este código al principio, 320 para iPhone y 750 para iPad, pero el ancho real de contentView es 300 para iPhone y 698 para iPad (para retrato, ancho de pantalla) y luego desplazo la tabla hacia arriba y hacia abajo, valores correctos – Alexander

+0

justo en algún momento, pero es extraño volver a cargar la tabla del delegado, que es responsable de esa recarga;) Y tendré que volver a cargar la tabla cada vez que quiera mostrar una nueva celda, que aún no se ha mostrado. – Alexander

+0

¡Esta es una solución desagradable, tener que volver a cargar toda la vista de tabla para calcular que esto no es realmente aceptable! – simonthumper

0

contentView El ancho de la celda de una UITableView no se establece cuando se crea la célula, por lo que podría establecer el autoresizingMask para la etiqueta, así:

label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; 

Para mí que estaba trabajando.

Cuestiones relacionadas