2010-09-17 4 views
0

J'ai une situation quelque peu particulière avec laquelle j'ai besoin d'aide. J'ai un CustomView que je place dans chaque UITableViewCell dans mon UITableView. Aucun problème là-bas.Problème avec CAGradientLayer dans un UIView personnalisé dans un UITableViewCell

Dans mon CustomView est un UILabel qui affiche du texte qui lui est donné. Selon la longueur du texte, la largeur de la CustomView augmente/diminue. Tout va bien.

Le problème que j'ai est avec une sous-couche dans mon CustomView qui est un gradient (CAGradientLayer). La taille du dégradé ne va pas grossir/rétrécir l'écran sur les cellules qui ne sont pas visibles.

Permettez-moi de vous montrer un peu de code ... Je crée mon CustomView comme ceci:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"Cell"; 

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

    CustomView *custom = [[CustomView alloc] init]; 
    custom.tag = 777; 
    [cell.contentView addSubview:custom]; 
    [custom release]; 

} 

} 

Je n'initWithFrame pas à ce stade que la cellule pourrait obtenir réutilisé et la largeur est toujours tort. Une fois que la cellule est là, j'appelle une méthode configureCell: où je fais ce qui suit:

CGSize teamMaxSize = CGSizeMake(300, 18); 
CGSize teamNewSize = [[managedObject valueForKey:@"category"] 
    sizeWithFont:[UIFont systemFontOfSize:kFontSizeTeam] 
    constrainedToSize:teamMaxSize 
    lineBreakMode:UILineBreakModeWordWrap]; 

CustomView *lozenge = (CustomView *) [cell.contentView viewWithTag:777]; 
lozenge.frame = CGRectMake(10, 5, teamNewSize.width+12, 18); 
[lozenge resetSize]; 
[lozenge setLabel:[managedObject valueForKey:@"category"]]; 

Cela fonctionne bien, la largeur de mon CustomView est configuré selon la longueur de la clé « catégorie ». Le resetSize; La méthode ci-dessus redimensionne simplement l'UILabel que j'ai mentionné précédemment à la nouvelle image de CustomView avant de la remplir avec la valeur.

Quoi qu'il en soit, revenez à mon problème. Je crée le dégradé d'arrière-plan dans la méthode drawRect: de mon CustomView. Cela fonctionne bien, mais est la taille de la CustomView à init. Après avoir redimensionné j'ai besoin de redimensionner le gradient.frame. Donc, j'ai essayé d'ajouter

gradient.frame = self.bounds 

Lorsque j'appelle resetSize dans mon code mentionné ci-dessus. Cependant, lorsque je fais défiler l'UITableView, je peux voir le dégradé se remplir littéralement de gauche à droite au fur et à mesure qu'il se charge. Y a-t-il de toute façon que je puisse arriver à ce que cela se produise "hors écran" de sorte que le CustomView est rempli avec le dégradé dès qu'il apparaît?

Répondre

1

Au lieu de créer un gradient dans drawRect:, avez-vous envisagé d'utiliser CAGradientLayer comme la classe de la couche de votre vue personnalisée, par exemple:

+ (Class)layerClass 
{ 
    return [CAGradientLayer class]; 
} 

Ensuite, vous pouvez effectuer une configuration de votre dégradé dans votre initialiseur, via self.layer .

+0

mais la largeur de mon dégradé ne peut pas être définie lorsque j'initialise le CustomView ... Je dois attendre ... – mootymoots

+0

Je ne suis pas sûr de comprendre exactement ce que vous essayez de faire, mais si vous essayez de créer un fond dégradé pour votre cellule, je suggère de créer une classe simple 'CustomBackgroundView' comme décrit (avec un support' CAGradientLayer') et de l'attacher à la propriété 'backgroundView' de votre cellule. Il devrait être automatiquement dimensionné pour votre cellule, et vous pouvez faire le reste de votre dessin personnalisé dans votre 'CustomView'. – bosmacs

+0

Je crée un dégradé en arrière-plan de mon CustomView. Imaginez la vue personnalisée comme un bouton losange avec une ligne de texte. Il se trouve dans ma cellule avec d'autres objets ... – mootymoots

Questions connexes