Ombre pour une NSView

Bonjour à  tous



J'ai un souci au sujet de la création d'ombre sur un objet, en l'occurrence ici un NSView. La doc et les forums démontrent que sa mise en oeuvre est facile mais chez moi, ça ne marche pas. Qu'est ce que j'ai oublié ??

Voici le code :
<br />
NSShadow *shadow = [[NSShadow alloc] init];<br />
[shadow setShadowOffset:NSMakeSize(7,-7)];<br />
[shadow setShadowBlurRadius:20.0];<br />
[shadow setShadowColor:[NSColor colorWithDeviceWhite:0.5 alpha:0.3]];<br />
[shadow set];<br />
<br />
[mavue setShadow:shadow];<br />




Merci d'avance

Réponses

  • MistifiouMistifiou Membre
    octobre 2012 modifié #2
    Alors je ne sais pas comment tu fait mais je peu te dire comment de mon côté je m'y prend avec les shadow.




    #import <QuartzCore/QuartzCore.h>



    .

    .

    .



    vue.layer.shadowColor = [UIColor LaBelleCouleurQueJaimeEnOmbre].CGColor;

    vue.layer.shadowOffset = CGSizeMake(10.0f, 10.0f);

    vue.layer.shadowOpacity = 0.5f;

    vue.layer.shadowRadius = 10.0f;


  • CéroceCéroce Membre, Modérateur
    octobre 2012 modifié #3
    @Mistifiou C'est une question pour Mac OS X...



    @Fred20 ça me paraà®t bon, même si je l'ai utilisé il y a bien longtemps. A priori, ce sont surtout tes paramètres qui sont réglés un peu fort:


    <br />
    <br />
    NSShadow *shadow = [[NSShadow alloc] init];<br />
    [shadow setShadowOffset:NSMakeSize(0.0f,-7.0f)];<br />
    [shadow setShadowBlurRadius:10.0f];<br />
    [shadow setShadowColor:[NSColor colorWithCalibratedWhite:1.0f alpha:0.5f]];<br />
    




    Tu n'as pas besoin d'appeler -set. La méthode sert à  appliquer l'ombre avant de faire un dessin (voir la doc de Core Graphics).
  • Merci pour ces réponses rapides mais ça ne marche toujours pas. En fait, [shadow set] me donne un message d'erreur ds la console : essaiCoreImage[17566] <Error>: CGContextSetStyle: invalid context 0x0 , et je vois pas ou est ce ContextSetStyle
  • Autan pour moi Céroce image/smile.png' class='bbc_emoticon' alt=':)' />.



    @Fred : Je pense que ça aidera tout le monde si tu indique depuis quel endroit tu essaie d'appliquer un shadow. D'ailleurs, le problème dois venir de là  a mon avis.
  • Ah oui, pardon, je suis dans la methode (void) awakeFromNib
  • Et j'oubliais, le but est de créer une ombre pour autour d'une NSView qui comprend une image
  • CéroceCéroce Membre, Modérateur
    octobre 2012 modifié #8
    Bon, en fait, je n'avais jamais utilisé une ombre sur une NSView. Je suis allé voir un peu plus loin dans la doc:






    [font=Courier, Consolas, monospace]- (void)setShadow:(NSShadow *)shadow[/font]

    Discussion

    This method sets the shadowColor,shadowOffset, shadowOpacity and shadowRadius properties of the receiver's layer.

    Sending this message to a view that is not managing a Core Animation layer causes an exception.




    Donc, la vue doit utiliser une CALayer.



    Essaie:
    <br />
    [vue setWantsLayer:YES];<br />
    // Puis appliquer l&#39;ombre.<br />
    
  • Oui, oui, j'avais vu ça et juste au dessus du code j'ai écris le code suivant :
    <br />
    theLayer=[CALayer layer];<br />
    theLayer.position=CGPointMake(50.0f,50.0f);<br />
    theLayer.bounds=CGRectMake(0.0f,0.0f,100.0f,100.0f);<br />
    [mavue setLayer:theLayer];<br />
    [mavue setWantsLayer:YES];<br />
    




    Mais ça ne marche pas. Est ce que cela viendrait des valeurs des positions ?
  • CéroceCéroce Membre, Modérateur
    Voici un projet d'essai:



  • CéroceCéroce Membre, Modérateur
    'Fred20' a écrit:


    Mais ça ne marche pas. Est ce que cela viendrait des valeurs des positions ?




    En fait, je ne veux pas entrer dans les détails de Core Animation sur Mac, que je ne suis pas sûr de pouvoir t'expliquer, mais il y a deux modes de fonctionnement différents, selon qu'on appelle setWantsLayer: avant de fournir une layer ou non.

    Dans la plupart des cas, tu as juste à  faire setWantsLayer:YES, et ça te crée une "Backing layer" qui conservera la taille de la vue.
  • Merci pour ton aide mais J'ai un pbl avec ton exemple: apparemment il est sous iOS et sans doute sur xcode 4. je ne suis que sous 3.2... J'ai rectifié le CEAppDelegate.h (weak remplacé par noanatomic, assign, mais le mainMenu.xib ne peut pas s'ouvrir et bien sur me donne un message d'erreur...
  • CéroceCéroce Membre, Modérateur
    Sérieux, pourquoi ne passes-tu pas à  Xcode 4 ? La seule bonne raison de ne pas le faire serait de cibler 10.5 (et encore).



    Crée toi-même le xib. Il s'agit du XIB du template avec deux différences:

    - j'ai ajouté une instance de CEOvalView

    - j'ai coché la layer pour la fenêtre
  • EN fait, je suis resté sous 10.6.8 car j'utilise pour mon job Final cut pro et il semble que la nouvelle version nécessaire sous 10.7 bug trop souvent. Donc ds l'attente de sa stabilité, je reste à  l'état préhistorique !



    Sinon, j'essaye de créer ce xib



    Merci encore
  • Bon, j'ai recrée un projet en prenant en compte tes paramètres. J'ai essayé de faire une ombre pour une NSView et une autre pour NSImageView. Pour l'imageView, j'ai des petites pointes d'angle qui apparaissent mais je n'arrive pas à  les amplifier .



    En pièce jointe mon projet. Si tu as un peu de temps pour y jeter un coup d'oeil.



    Merci d'avance
  • CéroceCéroce Membre, Modérateur
    octobre 2012 modifié #16
    1) Si la vue n'affiche rien, alors elle ne peut pas avoir d'ombre. Reprends CEOvalView dans mon projet d'exemple.



    2) Pour l'imageView: retire setWantsLayer:YES de ton code et coche la case dans le XIB, pour que ce soit la contentView de la fenêtre qui ait une layer.



    C'est cette case qu'il faut cocher:



  • Géééénial, ça marche



    Merci encore

    et sans doute A+
Connectez-vous ou Inscrivez-vous pour répondre.