2010-04-14 9 views
10

J'ai un UITableViewCell personnalisé avec une disposition personnalisée. Je voulais un arrière-plan dégradé, donc dans ma méthode cellForRowAtIndexPath: UITableViewDelegate, je crée un CAGradientLayer et l'ajoute à la couche de la cellule avec insertSubLayer: atIndex: (en utilisant l'index 0). Cela fonctionne très bien, sauf pour deux choses:UITableViewCell avec arrière-plan dégradé personnalisé, avec un autre dégradé comme couleur de surbrillance

Plus important encore, je n'arrive pas à comprendre comment changer de couleur de dégradé lorsque la ligne est en surbrillance. J'ai essayé quelques trucs, mais je ne connais pas assez le framework pour le faire fonctionner. Où serait l'endroit idéal pour mettre ce code, à l'intérieur du délégué de la table ou de la cellule elle-même?

De plus, il y a un espace blanc 1px entre chaque cellule de la table. J'ai une couleur de fond sur la vue principale, une couleur de fond sur la table, et une couleur de fond sur la cellule. Existe-t-il une sorte de remplissage ou d'espacement par défaut dans UITableView?

+0

Il y a un vraiment bon article sur [Cocoa avec amour] (http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html) sur la personnalisation de l'apparence d'une vue de table. Je pense que merci de répondre à votre question. – drekka

+0

meilleur lien jamais ... BEAUCOUP apprécié. Je suis vraiment nouveau à l'iPhone et le portage d'une application d'Android où je suis beaucoup plus à l'aise s'avère être assez difficile. – Rich

+0

Matt est génial! –

Répondre

2

Je ne suis pas sûr de la première question mais je pense que vous pouvez définir la propriété selectedBackgroundView de la même manière que vous définissez la propriété backgroundView. L'espace blanc entre les cellules est probablement le séparateur. Vous pouvez changer cette couleur comme

tableView.separatorColor = [UIColor redColor]; 
+0

J'ai essayé, mais peut-être pas la bonne façon. Quoi qu'il en soit, le lien fourni par Derek ci-dessus montre un exemple de configuration de tableView.separatorStyle à UITableViewCellSeparatorStyleNone, ce qui est probablement ce que je recherche. Merci pour la réponse! – Rich

2

J'ai lutté pendant des jours avec ceci. La solution a fini par être assez simple mais les différentes parties du puzzle ont été réparties sur plusieurs réponses et sites différents. La pièce manquante du puzzle s'est avérée être la distinction entre la vue de contenu et la vue d'arrière-plan et où la couleur de sélection est appliquée.

Caractéristiques de ma solution:

  • que je charge ma cellule à partir d'une plume pour que je puisse la mise en page du contenu IB. N'hésitez pas à mettre en forme le contenu par programmation.
  • Je récupère les couleurs du dégradé à partir d'un objet de style global car j'ai besoin de personnaliser le dégradé par client.
    • Je mets la couleur de sélection de la cellule à gris dans la plume afin que le défaut (bleu) ne soit pas en conflit avec mon schéma de couleurs.
  • J'ajoute les dégradés à la vue d'arrière-plan. Si vous ne le faites pas, la couleur de sélection ne s'affiche pas correctement. UITableViewCell n'a pas de vue d'arrière-plan par défaut, vous devez donc le créer en premier.

Ce dernier point était l'ingrédient secret qui a fait que tout a fonctionné pour moi.

J'ai ajouté une méthode d'usine à ma sous-classe UITableCellView parce que je voulais utiliser la même cellule dans plusieurs tables.

+(ActivityDetailCellView *) createWithStyle: (WMStyle *) style { 
    UIViewController *temporaryController = [[UIViewController alloc] 
     initWithNibName: @"ActivityDetailCellView" 
     bundle: nil]; 

    ActivityDetailCellView *cell = (ActivityDetailCellView *) temporaryController.view; 

    CAGradientLayer *lightGradient = [CAGradientLayer layer]; 
    lightGradient.frame = cell.bounds; 
    lightGradient.colors = style.lightGradient; 

    UIView *background = [[UIView alloc] initWithFrame: cell.bounds]; 
    [background.layer insertSublayer:lightGradient atIndex:0]; 
    cell.backgroundView = background; 

    return cell; 
} 
+0

Cela ressemble à une excellente solution - J'aime l'idée de la contenir dans la sous-classe UITableViewCell. Une question cependant - qu'est-ce que (WMStyle *)? – ardochhigh

+0

Je garde tous mes paramètres liés au style (polices, couleurs, dégradés, etc.) dans une classe afin que je puisse les changer en un seul endroit. –

+0

Salut Kevin. Cela semble génial. Est-il possible de poster un exemple simple? Merci Sean – ardochhigh

19

Je sais que ce fil est vieux, mais voici une solution pour la première partie de votre question (en ajoutant un dégradé aux sélectionnés et les états non sélectionnés d'une cellule):

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    [cell setBackgroundColor:[UIColor clearColor]]; 

    CAGradientLayer *grad = [CAGradientLayer layer]; 
    grad.frame = cell.bounds; 
    grad.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil]; 

    [cell setBackgroundView:[[UIView alloc] init]]; 
    [cell.backgroundView.layer insertSublayer:grad atIndex:0]; 

    CAGradientLayer *selectedGrad = [CAGradientLayer layer]; 
    selectedGrad.frame = cell.bounds; 
    selectedGrad.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil]; 

    [cell setSelectedBackgroundView:[[UIView alloc] init]]; 
    [cell.selectedBackgroundView.layer insertSublayer:selectedGrad atIndex:0]; 
} 
+0

Cette approche fonctionne plutôt bien. – ardochhigh

+0

copier et coller dans votre projet - fonctionne très bien – HotJard

+4

Si vous avez une longue table, cette méthode va continuer à ajouter des choses à la même cellule –

Questions connexes