2009-10-25 4 views
1

J'ai un UITableView avec des cellules personnalisées. J'ai les classes MyTableViewCell : UITableViewCell et MyTableViewCellContentView : UIView Ce que je fais est essentiellement ce qui est fait dans le AdvancedTableViewCells demo app from Apple avec un léger changement, sur certaines lignes, je veux utiliser un fond clearColor pour montrer l'arrière-plan de la table derrière le texte peint.Cocoa-Touch: Comment: personnalisé UITableViewCell avec UIColor fond clearColor

Ainsi, dans MyTableView 's cellForRowAtIndexPath que je fais:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"MyCell"; 

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

    cell.someValue = indexPath.section; 
    [cell finishedSetup]; 

    return cell; 
} 

Et dans mes MyTableViewCell' s finishedSetup:

cellContentView = [[MyTableViewCellContentView alloc] initWithFrame:CGRectMake(0, 0, 320, 80) cell:self]; 
cellContentView.autoresizingMask = UIViewAutoresizingNone; 
cellContentView.contentMode = UIViewContentModeRedraw; 
[self.contentView addSubview:cellContentView]; 

Et dans MyTableViewCellContentView je mets en œuvre la méthode drawRect. Et prévoyez de ne pas utiliser de sous-vues, mais dessinez mon contenu personnalisé, tout comme l'exemple d'Apple dans le CompositeSubviewBasedApplication. Le problème est que pour quelques sections je veux utiliser un clearColorbackgroundColor. Cela fonctionne, jusqu'à ce qu'une cellule avec un clearColorbackgroundColor soit réutilisée pour dessiner une cellule clearColor, à ce moment l'arrière-plan n'est pas effacé et aura toujours l'ancienne couleur.

Comment redessiner l'arrière-plan?

Modifier: j'ai oublié de mentionner, je définir la couleur de fond dans MyTableViewCellContentView de INIT après avoir appelé init super. Réglage via:

self.backgroundColor = [UIColor clearColor]; 

J'ai vérifié que cela, en fait, ne s'appelle et est appelé comme prévu avec clearColor ou redColor.

J'ai également essayé de définir la couleur de fond de la cellule de la table, cela n'a pas aidé.

Edit # 2: Voici ma méthode de drawRect:

- (void)drawRect:(CGRect)rect { 
    [super drawRect:rect]; 
    static int i = 0; 
    [[NSString stringWithFormat:@"Cell %d", ++i] drawAtPoint:CGPointMake(3, 3) withFont:[UIFont boldSystemFontOfSize:16]]; 
} 
+0

Aucun des codes que vous avez inclus ne permet de définir les valeurs backgroundColor n'importe où ... où cela se produit-il? –

+0

@Sixten Otto: Je le fais dans l'init de MyTableViewCellContentView. Je le fais après avoir appelé super's init. J'ai également essayé de définir backgroundColor de l'ancêtre UITableViewCell, cela n'a pas aidé. – Prody

Répondre

0

Je n'ai pas découvert pourquoi cela se passait. Mais j'ai essayé une stratégie différente. Je ne réutilise plus les cellules de table, car je n'en ai pas beaucoup. Au lieu de cela, je crée toutes les cellules au démarrage et j'améliore réellement les performances en les affichant, car aucune configuration supplémentaire n'est nécessaire lors du défilement.

+0

Heureux de savoir que cela fonctionne. –

+1

Si je lis votre code correctement (et peut-être que je ne le suis pas), vous utilisez le même identificateur de cellule lorsque vous le supprimez. Si vous avez différents types de cellules (ce que vous voulez?), Vous devez utiliser des identifiants différents lorsque vous créez et/ou supprimez-les. – darelf

1

Pour définir le paramètre de couleur de fond prennent effet que vous devez faire la mise en tableView:willDisplayCell:forRowAtIndexPath - le système d'exploitation ne modifiera pas tout ce que vous définissez ici. La raison en est que certaines configurations supplémentaires de la cellule sont effectuées par le système d'exploitation après que vous l'ayez renvoyé de tableView:cellForRowAtIndexPath. Si vous le pouvez, jetez un coup d'œil à la session 101 de la WWDC 09 présentée par Jason Beaver.

+0

J'ai implémenté willDisplayCell, et dedans: 'cell.backgroundColor = [UIColor clearColor]; cell.contentView.backgroundColor = [UIColor clearColor]; '. En utilisant le débogueur, j'ai confirmé qu'il était appelé. Mais ça n'a pas aidé. – Prody

+0

Etes-vous sûr à 100% que toutes les sous-vues de la cellule sont claires là où c'est nécessaire? self.backgroundView.backgroundColor = [UIColor clearColor]; self.contentView.backgroundColor = [UIColor clearColor]; self.view.backgroundColor = [UIColor clearColor]; etc. en fonction de votre style de cellule –

+0

@Adam Eberbach: comme mentionné dans la publication, je n'ai pas d'autres sous-vues, je dessine manuellement des éléments dans l'UIView personnalisé pour des raisons de performances. Actuellement, je ne dessine qu'un texte. Mais mon problème n'est pas que l'arrière-plan n'est pas défini sur transparent, il est correctement défini. Mon problème est que la partie transparente n'est pas redessinée quand une cellule est réutilisée. C'est comme si vous utilisiez un morceau de papier pour prendre des notes plusieurs fois. – Prody

Questions connexes