• Billet écrit dans : Mobile, iPhone 06.03.2009

    Coupé depuis 1 mois d’internet à domicile, je n’ai pas trop le temps de blogger au boulot… Ne faisans pas trop de veille technologique et ne pouvant parler des projets d’entreprises je n’ai pas grand chose à raconter sous forme de long tutoriel.

    J’entame donc une nouvelle façon de blogger mes découvertes : à travers de brêves. Aujourd’hui, pour renouer avec le lectorat « iphone », il sera question de TableView !

    TableView

    Avez vous déjà essayé de rendre une ligne sur deux d’une couleur différente (le background, les textes des labels et leurs états « survolés » ? Hey bien c’est la merde ! Voici la solution que j’ai pu trouver ici et là.

    • Avoir une classe qui gère une cellule.
    • Avoir une méthode de colorisation efficace pour la cellule
    • Détecter si la cellule courante est pair ou impair.

    Tout d’abord, dans la méthode à trifouiller

    1
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

    Nous devons détecter si la cellule courante est pair ou impair. Ne faites pas comme moi et  ne partez pas de l’indexPath pour déterminer l’index courant dans votre tableau d’élément pour savoir si celui ci est pair ou impair. Cette méthode marche mais elle provoque des bugs d’affichages sur un iphone (les couleurs se mélangent, s’alternent etc quand vous scroller trop vite ou d’une certaine manière). Voici la méthode magique, simple :

    1
    
    bool detectPairImpair = indexPath.row % 2;

    Et à coup sur vous aurez le bon résultat. Maintenant la phase de colorisation. Quand j’initalise ma cellule, je passe en paramètre ce booleen afin d’avoir la gestion des couleurs dans ma classe cellule. Il suffit d’appeller la méthode de colorisation adéquate.

    1
    2
    
    UIColor * greenColor = [[UIColor alloc] initWithRed:0.0 green:1.0 blue:0.0 alpha:1.0];
    UIColor * redColor = [[UIColor alloc] initWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];

    Vous noterez que les couleurs vont de 0 à 1, pensez à diviser par 255 pour passer d’une représentation RGB classique à ce système. (Je vous apprend la division, pas mal non ? ^^)

    Puis, pour le principe, voici ce que j’utilise. Cette méthode est incomplète et ne marche pas tel quel.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier pair:(bool)detectPairImpair {
     
    UIColor * greenColor = [[UIColor alloc] initWithRed:0.0 green:1.0 blue:0.0 alpha:1.0];
    UIColor * redColor = [[UIColor alloc] initWithRed:1.0 green:0.0 blue:0.0 alpha:1.0];
     
    if(!detectPairImpair){
    [self setCellColor:greenColor];
    self.libelle = [self newLabelWithPrimaryColor:greenColor selectedColor:redColor fontSize:14.0 bold:YES];
    self.libelle.text = @"Coucou";
    [myContentView addSubview:self.libelle];
    } else {
    self.libelle = [self newLabelWithPrimaryColor:redColor selectedColor:greenColor fontSize:14.0 bold:YES];
    self.libelle.text = @"Salut";
    [myContentView addSubview:self.libelle];
    [self setCellColor:redColor];
    }
    }

    Je ne rentrerai pas dans les détails pour la création d’une cellule personnalisé, mais voici les méthodes de colorisations que j’utilise :

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    
    - (UILabel *)newLabelWithPrimaryColor:(UIColor *)primaryColor selectedColor:(UIColor *)selectedColor fontSize:(CGFloat)fontSize bold:(BOOL)bold
    {
    /*
    Create and configure a label.
    */
    UIFont *font;
    if (bold) {
    font = [UIFont boldSystemFontOfSize:fontSize];
    } else {
    font = [UIFont systemFontOfSize:fontSize];
    }
    /*
    Views are drawn most efficiently when they are opaque and do not have a clear background, so set these defaults.  To show selection properly, however, the views need to be transparent (so that the selection color shows through).  This is handled in setSelected:animated:.
    */
    UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    newLabel.backgroundColor = [UIColor clearColor];
    newLabel.opaque = YES;
    newLabel.textColor = primaryColor;
    newLabel.highlightedTextColor = selectedColor;
    newLabel.font = font;
    return newLabel;
    }
     
    - (void) setCellColor: (UIColor*)color
    {
    cellColor = color; // cellColor est une propriété de la classe de type UIColor
    }
     
    /*
    this function will layout the subviews for the cell
    */
    - (void)layoutSubviews {
    [super layoutSubviews];
    [ self spreadBackgroundColor:self withColor:cellColor ];
    }
    - (void) spreadBackgroundColor: (UIView*)that withColor: (UIColor*)bkColor<br />
    {
    NSEnumerator *enumerator = [that.subviews objectEnumerator];
    id anObject;
    while (anObject = [enumerator nextObject]) {
    if( [anObject isKindOfClass: [ UIView class] ] )
    {
    ((UIView*)anObject).backgroundColor = bkColor;
    [ self spreadBackgroundColor:anObject withColor:bkColor];
    }
    }
    }

    Voilà, j’espère que ca vous sera utile.

    Billet écrit dans : Mobile, iPhone 06.03.2009

    Tags: , , , ,

  • 4 Réactions !!

    WP_Modern_Notepad
    • GrM dit:

      hey ,

      Et bien, crois le ou pas, moi ça me sert !

      Je cauchemarde d’objective C en ce moment :p

      (comment tu survis sans Internet chez toi???)

    • Guillaume chave dit:

      Ouaip, l’objective C est quelque peu déroutant au début. Mais quand on commence à se servir des méthodes delegate et le fait de créer ses propres classes ça commence à être puissant et « fun ». Mon dernier projet « megalo(s) » m’a permis de bien mettre tout à plat au niveau des logiques de programmation et je commence à être efficace.

      Je continuerais de faire des billets iphone si ça peut te servir alors :) Sur des points particuliers comme ici.

      (sinon pour le net, je me suis acheté une télévision HD TNT intégré de 82cm et là ce week end une nintendo DS avec un linker (pour programmer dessus ^^) donc voilà ^^)

    • GrM dit:

      Ah ouai ! le geek est toujours la alors :p

      Tes tutos me servent énormement, j’ai encore du mal avec la logique, la syntaxe, les objets tout ça (ouai ça fait beaucoup !).

      mais des que j’ai chopé le trucs, j’ai plein d’idées d’application.

      merci !

      ++

    • GrM dit:

      Ah bah tient.

      Je cherchais à faire ça, évidement je retombe ici :)

      1ère page sur UIColor, c’est cool. et c’est le premier résultat explicite que je trouve en plus. re-merci

    Réagissez a cet article ?!

    Attention: Les commentaires sont modérés et ne sont pas visibles automatiquement. Ce n'est pas la peine de re-soumettre votre commentaire.

CV Guillaume chave