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?
OriginalL'auteur BillEccles | 2011-06-07
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que ce que vous voyez est en raison de l'évolution de la cellule accessoire de vue qui finira par redimensionner l'affichage du contenu de la prochaine fois que la cellule effectue
-layoutSubviews
. Qui devrait se produire lorsque la cellule est ajoutée à la table, mais jusqu'alors les limites de l'affichage du contenu ne sera pas mis à jour.Peu importe je ne vois pas pourquoi ce serait un problème. Vous sembler n'être concerné avec réglage de la largeur de votre
theAgeTextField
donc, si vous taille appropriée par rapport à l'affichage du contenu actuel de la largeur et de définir saautoresizingMask
drapeaux pour lui donner une largeur flexible, alors il devrait augmenter ou de réduire au besoin, lorsque les limites de l'affichage du contenu de changement.Si vous avez besoin de plus de détails de mise en page de comportement alors cela devrait probablement se produire dans un
UITableViewCell
sous-classe. Voir-prepareForReuse
et-layoutSubviews
pour les possibilités de personnalisation de la cellule et de ses sous-vues. Votre source de données doit être en mesure de simplement passertheAge
à une instance de votre cellule de la sous-classe et de ne pas être concernés par les détails de la façon qui sera affiché.OriginalL'auteur Jonah
J'ai couru dans la même chose, sauf que le décalage était de 20, au lieu de 22. Je pense que Jonas réponse est sur la bonne voie, mais pour une solution de rechange rapide qui permet d'éviter le redimensionnement de comportement de la cellule.contentView.cadre/de limites, j'ai simplement utilisé des cellules.cadre/de limites que ma référence pour la pose sur les points de vue au sein de la cellule contentView.
OriginalL'auteur jay492355
Vous devez mettre en œuvre la hauteur de ligne, délégué de la méthode et de faire tous vos calculs en y
Il vous donnera ce que vous êtes après, vous avez également accès à l'indice de chemin, de sorte que vous pouvez facilement trouver la ligne dans votre tableau et faire tout ce dont vous avez besoin, sinon vous aurez de la taille d'un réutilisés ligne à partir de la file d'attente, qui est toujours par défaut de votre ligne de taille.
Parce que la cellule a un peu plus de vues, et accesseur les balises, comme les supprimer, aller de l'avant, faites glisser re-commande, vérifier et un peu plus, si le contenu ne devrait pas être pleine largeur. Personne n'est l'interdiction de le faire, mais si vous voulez le comportement par défaut de la tableview vous avez quelques choses à garder à l'esprit. Mais vous pouvez facilement définir un arrière-plan de la vue si vous voulez une image de fond ou la couleur.
OriginalL'auteur Trausti Thor