Un bouton semblable à  ceux d'Xcode

Bonjour,


 


Je cherche à  reproduire le style de bouton de Xcode, qui passent au bleu quand leur state==1.


 


Pour l'instant de m'en sors en définissant juste une image noire pour le state 0, et une autre, bleue, pour le state 1, et je les place dans IB (image / alternate).


 


Je ne demandais si, en dérivant NSButtonCell, il y avait moyen de ne définir que l'image noire, et de la "bleuir" dans drawWithFrame...


Mots clés:

Réponses

  • Voila une catégorie trouvé sur internet qui pourrait te donner une piste



    - (NSImage *)tintedImageWithColor:(NSColor *)tint
    {
    NSSize size = [self size];
    NSRect imageBounds = NSMakeRect(0, 0, size.width, size.height);

    NSImage *copiedImage = [self copy];
    [copiedImage setTemplate:NO];
    [copiedImage lockFocus];

    [tint set];
    NSRectFillUsingOperation(imageBounds, NSCompositeSourceAtop);

    [copiedImage unlockFocus];

    return copiedImage;
    }

    Si non voici des liens qui pourraient te guider:
    https://www.cocoacontrols.com/controls/inspectortabbar


    https://www.cocoacontrols.com/controls/dmtabbar

  • Merci Jeremy1729, voici la version que j'ai finalement adoptée:



    @implementation BFBlueButtonCell

    - (void) awakeFromNib {self.original = [self.image copy];}

    - (void) drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
    {
    NSSize size = [self.image size];
    NSRect imageBounds = NSMakeRect(0, 0, size.width, size.height);
    NSImage *copiedImage = [self.original copy];
    [copiedImage setTemplate:NO];
    [copiedImage lockFocus];
    if (self.state ==1)[[NSColor colorWithCalibratedHue:0.6 saturation:1 brightness:1 alpha:1] set];
    else [[NSColor blackColor]set];
    NSRectFillUsingOperation(imageBounds, NSCompositeSourceAtop);
    [copiedImage unlockFocus];
    [self setImage:copiedImage];
    [super drawInteriorWithFrame:cellFrame inView:controlView];
    }
    @end

    Je fais une copie de l'image dans une propriété que je recopie ensuite à  chaque dessin, pour en faire l'image du bouton.


     


    Question: est-ce que je risque des leaks en procédant ainsi ?


  • AliGatorAliGator Membre, Modérateur
    Cela me parait dommage de recréer et réaffecter l'image à  chaque "drawInteriorWithFrame:inView:" qui est une méthode de dessin, appelé à  chaque fois que la zone du bouton doit être redessinée (genre si elle a été recouverte par une autre fenêtre puis re-découverte ensuite). Il faut mieux faire tout ce code là  à  un autre endroit, genre le awakeFromNib, pour affecter l'image une fois pour toutes à  ton bouton plutôt qu'à  chaque passe de dessin

    Question: est-ce que je risque des leaks en procédant ainsi ?

    Etant donné que tu fais un "copy", il faut qu'il soit balancé par un "release" ou un "autorelease". A la fois dans le code "self.original = [self.image copy]" et dans le "copiedImage = [self.originalImage copy]". Sauf évidemment si tu utilises ARC où dans ce cas c'est ARC qui va gérer la mémoire et ces release/autorelease pour toi.
  • Juste. J'ai redéfini les deux images dans awakeFromNib. Aujourd'hui les Macs dessinent tellement vite qu'on en oublie les bons réflexes...


     


    Et pour le reste, j'utilise ARC, mais il ne met pas toujours à  l'abri des leaks... Je préférais être sûr.


  • J'ai déjà  eu a faire avec un problème de ce genre. Ma solution a été de créer une police avec ces images.

    C'est beaucoup plus simple de les colorer :)


  • NiClou,


    Les colorer certainement. Créer une police... je me demande s'il y a gain. En plus il faut inclure la police dans le bundle. Quelle taille, le fichier? Un petit PNG se compte en octets...


    En plus, il y a le côté Template de l'image, qui donne ce joli relief. Comment faire ça avec une fonte?


  • Alors la taille je serais incapable de te répondre c'était sur un vieux projet dans une ancienne boite.

    Cependant, l'intégration d'une fonte n'est pas compliqué, ce qui est compliqué est de savoir à  quelle lettre ton image correspond.

    Je ne pense pas que ce soit très lourd, d'autant plus que ce sont des petites images, après il est vrai que tu n'auras pas de relief.




  • c'était sur un vieux projet dans une ancienne boite.




    Du temps du Pascal, j'avais employé exactement le même truc en bricolant une fonte bitmap maison avec ResEdit. C'était sportif!  ^_^

Connectez-vous ou Inscrivez-vous pour répondre.