Contour autour d'une UIView

Bonjour j'aimerais ajouter un contour autour d'une UIView


 


J'ai donc essayé ça mais sans résultats...



#import <QuartzCore/QuartzCore.h>

myLabel.layer.borderColor = [UIColor greenColor].CGColor;
myLabel.layer.borderWidth = 3.0;

Pouvez-vous m'aider s'il vous plait ?


Réponses

  • samirsamir Membre
    décembre 2014 modifié #2

    Salut,


     


    Ou est-ce que tu as mis ce bout de code ? Est-ce que tu es a vérifié que "myLabel" n'est pas nil au moment de l'appel du bout de code que tu montres ? 


     


    si tu mis ce code dans le bon endroit et que ton "myLabel" est pas nil, y a pas de raison que ça ne marchera pas.


  • J'ai mis ça dans mon cellForRowAtIndexPath


     


    Logiquement il est pas nil, je l'ai crée dans le storyboard :/


  • Une idée du coup s'il vous plait ?


  • T'as bien les outlet ?



    myLabel.layer.borderColor = [UIColor greenColor].CGColor;
    myLabel.layer.borderWidth = 3.0;

    Ca tu l'a mis ou ?


  • En fait en vrai j'ai fait ça:



    cell.legende.layer.borderColor = [UIColor redColor].CGColor;
    cell.legende.layer.borderWidth = 3.0f;


    Dans le 




    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
  • le texte cell.legende s'affiche ? (il n'est juste pas encadré) ?


  • Oui il s'affiche avec un background color gris clair, mais il n'a pas de cadre ;)


  • affiche voir la frame de cell.legende dans la console de debug pour voir ce que ca raconte



  • NSLog(@%@", NSStringFromCGRect(cell.legende.frame));


     


    {{0, 0}, {0, 0}}


    {{0, 0}, {0, 0}}


    {{0, 0}, {0, 0}}


    {{0, 0}, {0, 0}}


    {{0, 0}, {0, 0}}


    {{0, 0}, {0, 0}}


  • Voila, en gros ta frame est de 0, donc forcément un contour autour de rien, ca reste rien ;)


     


    cell.legende c'est un UILabel ?


  • Non c'est une UIView


  • tu peux mettre tout le code de ton cellforrow ?


  • Vous avez ci joint le screen, le légende c'est le cadre gris à  côté de "Beneficiaires sans prestation"



    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        static NSString *simpleTableIdentifier = @celluleBeneficiaire;
        
        ListeBeneficiairesTableViewCell *cell = [listeBenefTableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
        
        if (cell == nil) {
            cell = [[ListeBeneficiairesTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }
        
        cell.legende.layer.borderColor = [UIColor redColor].CGColor;
        cell.legende.layer.borderWidth = 3.0f;
        NSLog(@%@", NSStringFromCGRect(cell.legende.frame));
        
        
        if([[self.statutBenef objectAtIndex:indexPath.row] isEqualToString:@1])
        {
            [cell setBackgroundColor:[UIColor colorWithRed:0.933 green:0.933 blue:0.933 alpha:1]];
        }
        else
        {
            [cell setBackgroundColor:[UIColor whiteColor]];
        }
        
        cell.nomPrenomBenef.text = [self.nomPrenomBenef objectAtIndex:indexPath.row];
        cell.ageBenef.text = [NSString stringWithFormat: @%@ ans", [self.ageBenef objectAtIndex:indexPath.row]];
        cell.villeBenef.text = [self.villeBenef objectAtIndex:indexPath.row];
        
        return cell;
    }

  • Joanna CarterJoanna Carter Membre, Modérateur

    Non, non, non. Ne touches pas la cellule ! Seulement la contentView.


  • Comment ça ?


  • Tu pourrais utiliser une syntaxe un peu plus moderne, ca serait plus lisible :)


     


    Exemple :



    [self.statutBenef objectAtIndex:indexPath.row]

    -->



    self.statutBenef[indexPath.row]

    Sinon ca view legende c'est autour des 3 elements du bas de cellule ?


     


    Et sinon ce que te dit Joanna c'est qu'il faut travailler sur cell.contentView et pas sur cell directement.



  • Sinon ca view legende c'est autour des 3 elements du bas de cellule ?



     

    Non légende c'est le rectangle gris en haut à  côté de "Bénéficiaires sans prestation"


  • Personne n'a d'idées s'il vous plait ? C'est vraiment le dernier détail à  régler sur l'application


  • AliGatorAliGator Membre, Modérateur
    NSLog(@%@", cell.legende)


    Je pense que c'est nil ce qui expliquerait ton problème.
  • Le NSLog renvoie effectivement "(null)".


     


    Comment régler ça s'il vous plait ?


  • Joanna CarterJoanna Carter Membre, Modérateur

    C'est cell ou légende qui est nil ? Si c'est legende, peut-être tu n'as pas connecté le IBOutlet de la cellule vers le label.


  • Jean75Jean75 Membre
    décembre 2014 modifié #23

    c'est "cell.legende" et j'ai vérifié il est bien connecté dans IBOutlet


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2014 modifié #24
    S'il est bien connecté, il ne peut pas être nil. Comment tu as fait la connection ?
  • AliGatorAliGator Membre, Modérateur
    décembre 2014 modifié #25

    ListeBeneficiairesTableViewCell *cell = [listeBenefTableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];        if (cell == nil) {        cell = [[ListeBeneficiairesTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];    }
    le voilà  ton problème. Si une cellule n'existe pas au lieu de créer à  partir du XIB, là  tu la créé avec un alloc/init standard. Du coup, vu qu'il n'utilise pas le XIB, l'IBOutlet ne sera pas connecté.


    ---


    Le code que tu as écrit correspond à  l'ancienne façon de faire. Depuis, ce n'est plus comme cela que l'on crée des cellules. Au lieu de ça, on commence par enregistrer le XIB ou la classe correspondant à  un reuseIdentifier (soit via code dans le viewDidLoad soit directement dans le Storyboard), et ensuite dans cellForRowAtIndexPath on utilise la nouvelle méthode "dequeueReusableCellWithIdentifier:forIndexPath:" (Enfin nouvelle... ça doit bien faire 3 ou 4 version d'iOS que c'est comme ça maintenant, ça date ^^) qui se charge de recycler une cellule existante si elle en a en stock (comme l'ancien "dequeueReusableCellWithIdentifier:")... mais se charge aussi de créer la cellule s'il n'en a pas en stock. Ce qui fait que tu n'as plus besoin, avec cette nouvelle méthode, du "if (cell == nil)" ni de créer la cellule toi même dans ce cas ; la nouvelle méthode retourne toujours une cellule et jamais nil, contrairement à  l'ancienne méthode. Et quand cette nouvelle méthode crée la cellule pour toi, elle utilise le XIB que tu aura précédemment enregistré / associé à  ce reuseIdentifier dans ton viewDidLoad via la méthode "registerNib:forReuseIdentifier:" (méthode à  appeler sur ta tableView)



    En faisant bien ainsi (cf la doc de UITableView ou le TableView Programming Guide pour des exemples de code), ta cellule sera bien créée en utilisant le XIB, et ton IBOutlet "légende" sera bien connecté et ne sera plus "nil", ce qui résoudra ton problème (et en + tu auras un code + propre et moderne et pas un code qui date de la façon de faire d'iOS 3 ou 4 et obsolète depuis !)
Connectez-vous ou Inscrivez-vous pour répondre.