CALayerDelegate n'est pas appelé
crashXpert
Membre
[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]
[font=arial, helvetica, sans-serif]CTEAppDelegate.m[/font]
[font=arial, helvetica, sans-serif]
[font=arial, helvetica, sans-serif]CTECALayerDelegate.h[/font]
[font=arial, helvetica, sans-serif]
[font=arial, helvetica, sans-serif]CTECALayerDelegate.m[/font]
[font=arial, helvetica, sans-serif]
[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] /huh.gif' class='bbc_emoticon' alt='???' />[/font]
[font=arial, helvetica, sans-serif]D'avance merci.[/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 <Cocoa/Cocoa.h><br />
#import <QuartzCore/QuartzCore.h>[/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 <NSApplicationDelegate><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 "CTEAppDelegate.h"<br />
#import "CTECALayerDelegate.h"[/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 <Cocoa/Cocoa.h><br />
#import <QuartzCore/QuartzCore.h>[/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 "CTECALayerDelegate.h"[/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] /huh.gif' class='bbc_emoticon' alt='???' />[/font]
[font=arial, helvetica, sans-serif]D'avance merci.[/font]
Mots clés:
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
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.
D'où ma question. On ne sait pas ce qu'il cherche à faire.
@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] /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]
Je me suis trompé, c'était setWantsLayer:.
Voici le document de guidelines officiel pour les conventions de nommage...
https://developer.ap...Guidelines.html