2011-10-04 20 views
8

Me he frustrado con esta pregunta durante un par de días. Estoy tratando de agregar un UILabel a una UITableViewCell. Quiero que UILabel abarque todo el ancho de la celda, menos 5 o 10 en los lados derecho e izquierdo para ver el aspecto. Mi problema está en determinar programáticamente el tamaño del marco de la celda en el que colocar la etiqueta. No importa qué UITableViewStyle utilizo, el valor de cell.contentVew.frame.size.width no está cerca del ancho del propio cuadro de celda.Recuperar un marco UITableViewCell

Por ejemplo, en la tabla estoy construyendo, puedo lograr el resultado deseado subclasificando UITableViewCell y creando un UILabel con una anchura determinada manualmente (a través de simplemente prueba y error) por:

CGRectMake(10, 12, 397, self.contentView.frame.size.height); 

Pero es ese número 397 que me está molestando. Quiero una forma de determinar programáticamente lo que debería ser para cualquier tabla de ancho o estilo. Esto debería ser un proceso simple simplemente determinando el ancho de todo el fotograma de la celda y luego restando 10 o 20 para que los bordes de UILabel no toquen realmente el borde de la celda.

Sin embargo, si fijo el tableViewStyle a UITableViewStyleDefault y luego tratar:

NSLog(@"Width: %f", self.contentView.frame.size.width); 

consigo 320. Si fijo el estilo a cualquiera de los otros tres estilos, el número devuelto es 302. Hasta el 320 número no está ni cerca del ancho del marco de celda (como con mi número de 397 manualmente determinado).

¿A qué valor necesito acceder que devolverá todo el ancho del marco de dibujo de la celda? Estoy seguro de que, como con la mayoría de los problemas, la solución me dará ganas de darme una bofetada en la frente, pero estoy al punto de estar preparado para eso ahora.

EDITAR para más información:

Una aclaración a cualquier persona interesada. Esta pregunta mía se refiere principalmente a una tabla de estilos agrupados. Para un estilo llano, la respuesta a mi pregunta anterior se puede determinar simplemente en el método cellForRowAtIndexPath por:

CGFloat cellWidth = [tableView rectForRowAtIndexPath:indexPath].size.width; 

El problema que estoy teniendo es que el método rectForRowAtIndexPath devuelve el ancho del marco en el que la célula es dibujado, lo cual está bien para una tabla de estilo simple ya que el ancho de la celda es todo el ancho del marco. Sin embargo, en una tabla agrupada, el ancho de la celda es menor que el ancho del marco en el que se dibuja, por lo que este método devolverá un número que es bastante más ancho que el ancho de la celda. Es posible que el ancho de la celda en un estilo de tabla agrupada sea un número fijo menor que el ancho del marco de la tabla, por lo que esta podría ser la forma de resolver el problema. Investigaré eso y responderé mi propia pregunta aquí si ese es el caso.

+0

La gran pregunta me da exactamente el mismo comportamiento y me vuelve loco. Mi solución fue no pensar en el tamaño del marco y solo referirme al ancho de las subvistas en porcentajes del tamaño de la vista del contenido.Estoy bastante seguro de que el marco de vista de contenido excluye las áreas a la izquierda y derecha de la celda reservada para los accesorios (mover, eliminar, divulgar, etc.) pero aún no responde el problema de por qué los marcos de celda siempre informan el tamaño incorrecto . Con suerte, alguien vendrá y le dará sentido a todo esto. – Rog

+0

¿Es esto en el paisaje? –

+0

@Bartosz - En mi ejemplo, obtengo números del retrato. – Chris

Respuesta

8

He determinado mi propia respuesta, y espero que ayude a cualquiera que tenga el mismo problema. El cálculo del margen de una tabla vista que encontré en this StackOverflow answer.

Este código proporcionará una etiqueta dentro de una celda tableView que abarca la celda con un margen entre los dos bordes de la celda, y se centra verticalmente dentro de la celda.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UILabel *label; 
    CGFloat groupedStyleMarginWidth, tableViewWidth; 
    UIFont *labelFont = [UIFont boldSystemFontOfSize:17.0]; // Set to whatever you like 
    NSString *labelText = @"Test String"; 

    // Calculate the margin between the cell frame and the tableView 
    // frame in a grouped table view style. 
    tableViewWidth = tableView.frame.size.width; 
    if (tableView.style == UITableViewStyleGrouped) { 
     if (tableViewWidth > 20) 
      groupedStyleMarginWidth = (tableViewWidth < 400) ? 10 : MAX(31, MIN(45, tableViewWidth*0.06)); 
     else 
      groupedStyleMarginWidth = tableViewWidth - 10; 
    } 
    else 
     groupedStyleMarginWidth = 0.0; 

    if (cell == nil) { 
     CGRect tableViewRect; 
     CGRect labelRect; 
     CGFloat x, y, w, h, labelMargin; 

     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

     // Retrieve the rect of the table view. 
     tableViewRect = [tableView rectForRowAtIndexPath:indexPath]; 

     // Set whatever margin around the label you prefer. 
     labelMargin = 10; 

     // Determine rect values for the label. 
     x = tableRect.origin.x + labelMargin; 

     // Calculate width of label 
     w = tableRect.size.width - (groupedStyleMargin * 2) - (labelMargin * 2); 

     // Calculate height of table based on font set earlier. 
     h = [labelText sizeWithFont:font].height; 

     // Calculate y position for the label text baseline to center 
     // vertically within the cell. 
     y = (tableRect.origin.y/2) - (h/4); 

     labelRect = CGRectMake(x, y, w, h); 

     label = [[UILabel alloc] initWithFrame:labelRect]; 
     label.text = labelText; 
     label.tag = 0; 
     [cell.contentView addSubview:stepLabel]; 
     [label release]; 
    } 
    else { 
     label = (UILabel *)[cell viewWithTag:0]; 
    } 
1

Suena como que esto se manejaría mejor con restricciones de diseño automático hoy en día.