2011-06-07 18 views
14

Uso cell.contentView.bounds.size.width para calcular la posición de un campo de texto en una celda UITableView. Cuando se crea la celda, el código de depuración informa el ancho como 302. Cuando la celda se desplaza fuera de la pantalla y luego vuelve a encenderse, el código de depuración informa que es 280, cada vez. Parece que no quiere volver a 302 y se queda atascado en 280. El resultado neto es que el campo de texto se pone en el lugar equivocado la segunda vez que se coloca el campo en contentView de la celda, aunque se colocó en el el lugar correcto la primera vez.UITableView cell.contentView.bounds.size.width Cambios con Cell Reuse

La figura 22 es significativa de alguna manera, pero no sé lo que es. Adivinando que podría ser la flecha de divulgación, moví el código de "borrar la celda" al frente de la determinación del ancho, incluido el ajuste del accesorio a nada.

¿Alguien puede decirme qué está pasando aquí?

El código (con irrelevante - que yo sepa - cosas cortó hacia fuera) tiene el siguiente aspecto:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    static NSString *CellIdentifier = @"Cell"; 

    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 


    // Configure the cell. 

    while([cell.contentView.subviews count]){ 
     id subview = [cell.contentView.subviews objectAtIndex:0]; 
     [subview removeFromSuperview]; 
    } 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

8< snip! 

    CGFloat theCellWidth = cell.contentView.bounds.size.width - 44.0; 
    CGFloat theLineHeight = [[UIFont boldSystemFontOfSize: [UIFont labelFontSize]+1.0] lineHeight]; 

    NSLog(@"cell.contentView.bounds.size.width %1.0f",cell.contentView.bounds.size.width); 

    if (0==section) { 
     switch (row) { 
      case 2: 
       while([cell.contentView.subviews count]){ 
        id subview = [cell.contentView.subviews objectAtIndex:0]; 
        [subview removeFromSuperview]; 
       } 
       cell.selectionStyle = UITableViewCellSelectionStyleNone; 
       cell.textLabel.text = @" "; 
       cell.detailTextLabel.text = @"The Age"; 
       theAgeTextField.frame = CGRectMake(10.0, 2.0, theCellWidth, theLineHeight); 
//    NSLog(@"cell.contentView %@",cell.contentView); 
       theAgeTextField.text = theAge; 
       theAgeTextField.font = [UIFont boldSystemFontOfSize: [UIFont labelFontSize]+1.0]; 
       theAgeTextField.keyboardType = UIKeyboardTypeDecimalPad; 
       theAgeTextField.borderStyle = UITextBorderStyleNone; 
       theAgeTextField.userInteractionEnabled = NO; 
       [cell.contentView addSubview:theAgeTextField]; 
       cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
       break; 

8< snip! (lots of closing braces and other stuff omitted) 

    return cell; 
} 

que desee probar este uno en casa, los niños y niñas?

Comience con una nueva aplicación basada en la navegación. Coloque el código siguiente en RootViewController.m:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 5; 
} 

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    NSLog(@"cell.contentView.bounds.size.width %1.0f",cell.contentView.bounds.size.width); 
    // Configure the cell. 
    return cell; 
} 

Sólo hay dos cambios en el código predeterminado requerido para que esto suceda: cambiar el número de filas en la sección ("return 5") y el estilo de la la celda debe ser UITableViewCellStyleSubtitle. Entonces, cuando se ejecuta el programa, verá cinco líneas de este:

2011-06-18 11:10:19.976 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.978 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.979 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.980 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 
2011-06-18 11:10:19.982 TestTableCells[7569:207] cell.contentView.bounds.size.width 302 

arrastrar algunas células fuera de la pantalla (arrastrar arriba - abajo no hace nada) y cuando reaparecen, se obtiene este :

2011-06-18 11:10:24.013 TestTableCells[7569:207] cell.contentView.bounds.size.width 320 
2011-06-18 11:10:24.047 TestTableCells[7569:207] cell.contentView.bounds.size.width 320 
2011-06-18 11:10:24.130 TestTableCells[7569:207] cell.contentView.bounds.size.width 320 

Francamente, estoy frustrado como diablo con esto, y estoy muy tentado a caballo hasta los $ 99 (sin una aplicación de trabajo, incluso) para que pueda tener a alguien en Apple pesan en este caso.

¿Alguien tiene alguna idea de lo que está pasando aquí?

Gracias!


¿Quieres algo más interesante? Prueba esto en lugar de la línea de static NSString...:

NSString *CellIdentifier = [NSString stringWithFormat: @"%d", arc4random() ]; 

    NSLog(@"%@",CellIdentifier); 

Ahora, cada vez, el ancho en el registro es siempre 302. Parecería, entonces, que una célula reutilizado tiene diferente ancho del contenido de la célula original .

De nuevo ... preguntando ... ¿Alguien tiene una pista?

+0

He notado un problema similar, por el cual estoy usando los límites de UITableViewCell para crear un CAGradientLayer para respaldar cada celda con un degradado. Mientras que el iPad está en modo vertical, veo cuadros blancos a la derecha de la celda, donde el ancho de la celda parece registrarse como ancho de orientación horizontal. Una vez que se han reutilizado el desplazamiento de la tabla y las celdas, las celdas registran que están en orientación vertical y recogen el ancho correcto. ¡Todavía estoy buscando cómo solucionarlo! – robotpukeko

Respuesta

10

Sospecho que lo que está viendo se debe a la modificación de la vista de accesorios de la celda que eventualmente cambiará el tamaño de la vista de contenido la próxima vez que la celda realiza -layoutSubviews. Eso debería ocurrir cuando la celda se agrega a la tabla, pero hasta entonces los límites de la vista de contenido no se actualizarán.

Independientemente, no veo por qué esto sería un problema. Parece que solo le interesa establecer el ancho de su theAgeTextField, por lo que si lo dimensiona adecuadamente en relación con el ancho actual de la vista de contenido y establece sus indicadores autoresizingMask para darle un ancho flexible, entonces debería crecer o reducirse según sea necesario cuando los límites del cambio de vista de contenido.

Si necesita un comportamiento de diseño más detallado, probablemente esto debería ocurrir dentro de una subclase UITableViewCell. Consulte -prepareForReuse y -layoutSubviews para conocer las oportunidades de personalizar la celda y sus subvistas. Su fuente de datos solo debe pasar theAge a una instancia de su subclase de celda y no preocuparse por los detalles de cómo se mostrará.

+1

Tendré que digerir lo que escribiste a la luz de lo que he codificado. El problema es que el texto en el campo de texto termina cortado en el extremo izquierdo. En cualquier caso, dé el ejemplo con el que edité esta publicación (que es libre de accesorios y campos de texto) y vea qué piensa entonces. – BillEccles

0

Debe implementar altura para el método fila delegado y hacer todos sus cálculos allí

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

// do math 

return newheight; 
} 

Se le dará lo que está después, usted también tiene acceso a la ruta del índice, para que pueda encontrar fácilmente la remar en su matriz y hacer todo lo que necesita, de lo contrario obtendrá el tamaño de una fila reutilizada de la cola, que siempre es su tamaño de fila predeterminado.

+0

¿Podría explicar por qué el ancho de la celda y el ancho del contenido de la celda no son los mismos? –

+0

Debido a que la celda tiene algunas vistas más, y las etiquetas de acceso, como eliminar, seguir adelante, arrastrar el pedido, verificadas y algunas más, por lo que la vista del contenido no debe ser de ancho completo. Nadie te está prohibiendo hacer eso, pero si quieres el comportamiento predeterminado de la tabla, tienes que tener en cuenta algunas cosas. Pero puede establecer fácilmente una vista de fondo si desea una imagen de fondo o color. –

1

Me encontré con lo mismo, excepto que el desplazamiento fue 20 en lugar de 22. Creo que la respuesta de Jonah está en el camino correcto, pero para una solución rápida que evita el comportamiento de cambio de tamaño de cell.contentView.frame/bounds, simplemente usé cell.frame/bounds como mi referencia para diseñar las vistas dentro de contentView de la celda.

+1

Otra cosa: descubrí que esto solo me estaba sucediendo cuando las celdas se mostraban con el estilo de tabla UITableViewStyleGrouped. Si el estilo de tabla era UITableViewStylePlain, cell.contentView.bounds.size.width no cambió. – jay492355