2010-07-17 7 views
1

Je crée une cellule UITableView de la manière suivanteLe texte de la cellule UITablview se déplace tout seul?

const NSInteger TOP_LABEL_TAG = 1001; 

UILabel *topLabel; 

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) 
{ 

    cell =[[[UITableViewCell alloc] initWithFrame:CGRectZero    reuseIdentifier:CellIdentifier] 
    autorelease]; 

    UIImage *indicatorImage = [UIImage imageNamed:@"indicator.png"]; 

    cell.accessoryView =[[[UIImageView alloc] initWithImage:indicatorImage] 
    autorelease]; 

    const CGFloat LABEL_HEIGHT = 25; 

    UIImage *image = [UIImage imageNamed:@"64x64.png"]; 

     topLabel =[[[UILabel alloc] initWithFrame:CGRectMake(
       image.size.width + 2.0 * cell.indentationWidth, 
       0.8 * (tableView.rowHeight - 1.7 * LABEL_HEIGHT), 
       tableView.bounds.size.width - 
       image.size.width - 4.0 * cell.indentationWidth 
       - indicatorImage.size.width, 
       LABEL_HEIGHT)] autorelease]; 

    [cell.contentView addSubview:topLabel]; 


     topLabel.tag = TOP_LABEL_TAG; 

    topLabel.textColor = [UIColor colorWithRed:0.25 green:0.0 blue:0.0 alpha:1.0]; 
    topLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0]; 

    topLabel.font = [UIFont systemFontOfSize:20]; 
    topLabel.textAlignment== UITextAlignmentCenter; 

} 

else 
{ 

    topLabel = (UILabel *)[cell viewWithTag:TOP_LABEL_TAG]; 
} 

topLabel.text = [NSString stringWithFormat:[aboutArray objectAtIndex:[indexPath row]]]; 
topLabel.textAlignment=UITextAlignmentCenter; 

première fois lorsque la table charge le fonctionnement tableView fine.But lorsque je navigue vers la page d'une autre page, le texte dans la première cellule de mouvements de table sur la droite et seulement la moitié de celui-ci visisble .. Quelle pourrait être la raison possible pour cela ??

+1

Veuillez corriger votre indentation. Il est très incohérent, ce qui le rend plus difficile à lire que nécessaire. –

Répondre

1

Il y a quelques bugs ici qui travaillent ensemble pour vous donner des problèmes.

Pour commencer, je pense que vous pourriez supposer que la cellule réutilisable dequeued a toutes les mêmes données qu'elle avait quand vous l'avez récupérée. La façon dont cela fonctionne réellement est que vous pouvez récupérer la même cellule, mais vous obtiendrez probablement une cellule différente, qui reste du haut ou du bas selon la direction de défilement. Lorsque les cellules ne sont plus visibles, elles sont signalées comme réutilisables dans un ordre non prévisible. Alors, retirez ce bloc else et déplacer toute la logique (autre que le init + autorelease en dehors du bloc if. De cette façon,

tout ce que vous vérifiez vraiment est que si vous avez besoin d'allouer une nouvelle mémoire. Deuxièmement, vous avez == UITextAlignmentCenter, vous voulez probablement utiliser =

Troisièmement, les mathématiques que vous utilisez pour calculer la géométrie de l'étiquette est suspect. Il semble que vous chargez une image, puis en utilisant la taille de cette image et les limites de table pour calculer dynamiquement une nouveau cadre d'étiquette Je considérerais sérieusement une nouvelle manière d'approcher ce calcul de cadre d'étiquette Êtes-vous sûr thi s est le seul moyen de le faire? Il me semble que les maths de votre cadre d'étiquette doivent être les mêmes à chaque fois.

Je l'ai nettoyé un peu afin qu'il soit lisible et mis en dessous avec des commentaires pour mieux illustrer ce que j'essaie de dire. J'espère que cela t'aides.

// initialize cell if need be 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease]; 
} 

// setup the accessory 
UIImage *indicatorImage = [UIImage imageNamed:@"indicator.png"]; 
cell.accessoryView = [[[UIImageView alloc] initWithImage:indicatorImage] autorelease]; 


// TODO: rewrite this 
UIImage *image = [UIImage imageNamed:@"64x64.png"]; 
const CGFloat LABEL_HEIGHT = 25; 
CGFloat x = image.size.width + 2.0 * cell.indentationWidth; 
CGFloat y = 0.8 * (tableView.rowHeight - 1.7 * LABEL_HEIGHT); 
CGFloat w = tableView.bounds.size.width - image.size.width - 4.0 * cell.indentationWidth - indicatorImage.size.width; 
CGFloat h = LABEL_HEIGHT; 
CGRect labelFrame = CGRectMake(x,y,w,h); 

// build a label and use it as the content view 
UILabel* topLabel = [[[UILabel alloc] initWithFrame:labelFrame] autorelease]; 
topLabel.textColor = [UIColor colorWithRed:0.25 green:0.0 blue:0.0 alpha:1.0]; 
topLabel.highlightedTextColor = [UIColor colorWithRed:1.0 green:1.0 blue:0.9 alpha:1.0]; 
topLabel.font = [UIFont systemFontOfSize:20]; 
topLabel.textAlignment = UITextAlignmentCenter; 
topLabel.text = [NSString stringWithFormat:[aboutArray objectAtIndex:[indexPath row]]]; 
topLabel.textAlignment = UITextAlignmentCenter; 

[cell.contentView addSubview:topLabel]; 
+0

thnku j'essaierais cette méthode de calcul d'étiquette. – Hemant

+0

il serait préférable de le faire comme une cellule de vue de table personnalisée de IB – slf

Questions connexes