UITableView cellule.contentView.les limites.taille.la largeur des Changements Avec la Cellule de Réutilisation

- Je utiliser cell.contentView.bounds.size.width pour calculer la position d'un champ de texte dans un UITableView cellule. Lorsque la cellule est créé, le code de débogage rapports largeur 302. Lorsque la cellule sort de l'écran et ensuite sur le dos, le code de débogage des rapports que c'est de 280 à chaque fois. Il ne semble pas vouloir revenir en arrière à 302 et reste bloqué à 280. Le résultat net est que le champ de texte est mis dans la mauvaise place la deuxième fois que le champ est mis dans la cellule contentView, mais il a été mis au bon endroit la première fois.

Je figure 22 est significatif d'une certaine manière, mais je ne sais pas ce que c'est. Deviner qu'il pourrait être la divulgation de la flèche, j'ai déplacé les "décochez la case" code à l'avant de la largeur de l'autodétermination, y compris le réglage de l'accessoire pour nada.

Quelqu'un peut-il me dire ce qu'il se passe ici?

Le code (avec hors de propos, que je connais--trucs ciselée) ressemble à ceci:

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

Veux essayer ceci à la maison, les garçons et les filles?

De commencer avec un nouveau système de Navigation-en fonction de l'Application. Placez le code suivant dans 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;
}

Il y a seulement deux changements dans le code par défaut requis pour ce faire: changer le nombre de lignes dans la section ("retour 5") et le style de la cellule doit être UITableViewCellStyleSubtitle. Puis, lorsque vous exécutez le programme, vous verrez cinq lignes de ce:

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

Glisser certaines cellules de l'écran (faites-le glisser vers le haut--ne pas faire n'importe quoi) et quand ils réapparaissent, vous obtenez ceci:

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

Franchement, je suis frustré que diable avec cela, et je suis très très tenté de rassembler les prix de 99 $(sans une application, même), donc je peux avoir quelqu'un chez Apple peser sur celui-ci.

Quelqu'un vous avez des idées de ce qui se passe ici?

Merci!


Envie de " voir quelque chose de plus intéressant? Essayez ceci à la place de la static NSString... ligne:

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

Maintenant, à chaque fois, la largeur dans le journal est toujours 302. Il semblerait, alors, qu'un réutilisés cellule a un contenu différent de la largeur de la cellule d'origine.

De nouveau... vous demandez-vous... quelqu'un a un idée?

J'ai remarqué un problème similaire, par lequel je suis en utilisant le UITableViewCell limites pour créer un CAGradientLayer à l'arrière de chaque cellule avec un dégradé. Alors que l'iPad est en mode portrait, je vois blanc cases à droite de la cellule, où la largeur de la cellule semble être de l'inscription en tant que paysage " de largeur. Une fois la table de défilement et les cellules sont réutilisés, les cellules registre qu'ils sont en orientation portrait et de sélectionner la bonne largeur. Toujours à la recherche de comment régler le problème!

OriginalL'auteur BillEccles | 2011-06-07