CALayerDelegate n'est pas appelé

[font=arial, helvetica, sans-serif]Hello,[/font]

[font=arial, helvetica, sans-serif]J'ai un problème pour être appelé sur drawLayer du delegate de mon CALayer. Je n'arrive pas à  voir mon erreur. Désolé, c'est un peu long, mais j'ai simplifié au maximum:[/font]



[font=arial, helvetica, sans-serif]CTEAppDelegate.h[/font]

[font=arial, helvetica, sans-serif]
<br />
#import &lt;Cocoa/Cocoa.h&gt;<br />
#import &lt;QuartzCore/QuartzCore.h&gt;[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]@class CTECALayerDelegate;[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]@interface CTEAppDelegate : NSObject &lt;NSApplicationDelegate&gt;<br />
{<br />
	IBOutlet NSView*	  MyView;<br />
	IBOutlet NSButton*	addButton;<br />
  <br />
	CALayer* MyCALayer;<br />
	CTECALayerDelegate* MyCALayerDelegate;<br />
}[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]-(IBAction)redrawLayerContent:(id)sender;<br />
@end[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]
[/font]

[font=arial, helvetica, sans-serif]CTEAppDelegate.m[/font]

[font=arial, helvetica, sans-serif]
<br />
#import &quot;CTEAppDelegate.h&quot;<br />
#import &quot;CTECALayerDelegate.h&quot;[/font][/size][/size][/font]<br />
[size=3][font=arial, helvetica, sans-serif]@interface CTEAppDelegate()<br />
-(void)setupCALayer;<br />
@end[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]@implementation CTEAppDelegate<br />
-(void)awakeFromNib<br />
{<br />
	MyCALayerDelegate = [[CTECALayerDelegate alloc] init];<br />
	[self setupCALayer];<br />
}[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]-(void)dealloc<br />
{<br />
	[MyCALayerDelegate release];<br />
	[super dealloc];<br />
}[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]-(void)setupCALayer<br />
{<br />
	MyCALayer = [CALayer layer];<br />
	MyCALayer.delegate = MyCALayerDelegate;<br />
	MyView.layer = MyCALayer;<br />
}[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]-(IBAction)redrawLayerContent:(id)sender<br />
{<br />
	[MyCALayer setNeedsDisplay];<br />
}<br />
@end[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]


[font=arial, helvetica, sans-serif]CTECALayerDelegate.h[/font]

[font=arial, helvetica, sans-serif]
<br />
#import &lt;Cocoa/Cocoa.h&gt;<br />
#import &lt;QuartzCore/QuartzCore.h&gt;[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]@interface CTECALayerDelegate : NSObject<br />
{<br />
}[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx;<br />
@end<br />
[/font]

[font=arial, helvetica, sans-serif]CTECALayerDelegate.m[/font]

[font=arial, helvetica, sans-serif]
<br />
#import &quot;CTECALayerDelegate.h&quot;[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]@implementation CTECALayerDelegate<br />
-(void)drawLayer:(CALayer *)layer inContext:(CGContextRef)context<br />
{<br />
	CGContextSetRGBFillColor (context, 1, 0, 0, 1);<br />
	CGContextFillRect (context, CGRectMake (0, 0, 200, 100 ));<br />
	CGContextSetRGBFillColor (context, 0, 0, 1, .5);<br />
	CGContextFillRect (context, CGRectMake (0, 0, 100, 200));<br />
}<br />
@end[/font][/size]<br />
[size=3][font=arial, helvetica, sans-serif]
[/font]

[font=arial, helvetica, sans-serif]quand je clic sur mon boutton, je suis bien rappellé sur redrawLayerContent, mais ça ne provoque pas l'appelle à  drawLayer ??[/font]

[font=arial, helvetica, sans-serif]Si quelqu'un voit l'erreur, je suis preneur car là  je ne voit pas du tout [/font][font=arial, helvetica, sans-serif] [/font][font=arial, helvetica, sans-serif] image/huh.gif' class='bbc_emoticon' alt='???' />[/font]

[font=arial, helvetica, sans-serif]D'avance merci.[/font]

Réponses

  • CéroceCéroce Membre, Modérateur
    Il manque au moins un
    [myView setNeedsLayer:YES];
    




    Pourquoi utiliser directement la CALayer et ne pas surcharger -[NSView drawRect:] ?
  • MalaMala Membre, Modérateur
    'Céroce' a écrit:


    Il manque au moins un
    [myView setNeedsLayer:YES];
    




    Pourquoi utiliser directement la CALayer et ne pas surcharger -[NSView drawRect:] ?






    L'usage de CALayer est bien plus pratique s'il a besoin de gérer une hiérarchie d'objets graphiques derrière. Et c'est plus performant que les NSView.



    Tu as bien fait un setWantsLayer à  YES sur ta myView?



    PS: un conseil, prends l'habitude de respecter les règles de nommage d'obj-C (myCALayer et non MyCALayer pour une instance). La lisibilité de ton code n'en sera que meilleur pour les autres.
  • CéroceCéroce Membre, Modérateur
    'Mala' a écrit:


    L'usage de CALayer est bien plus pratique s'il a besoin de gérer une hiérarchie d'objets graphiques derrière. Et c'est plus performant que les NSView.


    D'où ma question. On ne sait pas ce qu'il cherche à  faire.
  • crashXpertcrashXpert Membre
    mars 2013 modifié #5
    [font=arial, helvetica, sans-serif]Hello,



    @Céroce: Désolé, j'aurais effectivement dû préciser que j'ai besoin de plusieurs Layers hiérarchisés. J'ai simplifié au maximum mon exemple pour ne pas avoir un post de 3km, mais j'en ai perdu l'essentiel du coup.

    En revanche je n'ai pas trouvé la méthode setNeedsLayer que tu m'as indiqué ??



    @Mala: Effectivement, il me manquait un setWantsLayer sur ma NSView.

    J'étais persuadé avoir coché ma vue comme CALayer dans la section "Effect Inspector" d'Interface Builder, mais non.[/font][font=arial, helvetica, sans-serif] image/huh.png' class='bbc_emoticon' alt=' :/ ' />[/font]

    [font=arial, helvetica, sans-serif]Merci aussi pour l'info sur le nomage. Sais-tu dans quel document on trouve toutes ses règles?[/font]



    [font=arial, helvetica, sans-serif]En tout cas merci, je n'aurais pas pensé à  revérifier, ni à  testé en le forçant programatiquement.[/font]
  • CéroceCéroce Membre, Modérateur
    'crashXpert' a écrit:


    En revanche je n'ai pas trouvé la méthode setNeedsLayer que tu m'as indiqué ??


    Je me suis trompé, c'était setWantsLayer:.
  • MalaMala Membre, Modérateur
    'crashXpert' a écrit:


    [font=arial, helvetica, sans-serif]Merci aussi pour l'info sur le nomage. Sais-tu dans quel document on trouve toutes ses règles?[/font]


    Voici le document de guidelines officiel pour les conventions de nommage...

    https://developer.ap...Guidelines.html
Connectez-vous ou Inscrivez-vous pour répondre.