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?
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