2010-02-04 8 views
0

Voici mon code jusqu'à présent (dans le rect tirage):Dessin d'un NSImage dans la sous-classe NSView

// Drawing code here. 
NSLog(@"%@", [[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]); 
NSURL *pathToBGImage = [[NSURL alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]]; 
NSImage *NoiseBGMainView = [[NSImage alloc] initWithContentsOfURL:pathToBGImage]; 
[NoiseBGMainView drawInRect:[self bounds] fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1]; 

Et l'image ne tire pas ... Je ne sais pas ce qui ne va pas.

+2

Avez-vous prouvé que 'noiseBGMainView' n'est pas' nil'? –

+0

Comment vérifier? – nanochrome

+1

NSLog, de la même façon que vous avez fait l'URL. –

Répondre

4

Pourquoi ne pas simplement utiliser [NSImage imageNamed:@"NoiseBGMainView.jpg"] à la place? Cela vous donnera un NSImage de votre image (si elle peut le trouver), et nil si elle ne le peut pas. NSLog quels sont les résultats de cet appel, puis venez nous informer si vous vous connectez à (null) ou non.

+0

Le chemin est très bien, c'est le dessin qui est le problème – nanochrome

+0

allait juste répondre à cela. +1 –

+1

Eh bien, même si le chemin est correct, l'utilisation de 'imageNamed:' est préférable car le code affiché fuit NSURL et NSImage chaque fois qu'il s'exécute. – Kelan

1

Vous pouvez dessiner un NSImage dans un NSView sans écrire de code de dessin en attachant un NSImageView à votre vue et en définissant votre ressource image en tant qu'image de NSImageView. (NSImageView gère tous les dessins).

Si votre NSView personnalisé est chargé à partir d'une plume, vous n'avez besoin d'aucun code d'installation - faites simplement les connexions NSView-NSImageView-NSImage (ressource) appropriées avec Interface Builder.

+0

J'ai ceci, et cela ne fonctionne pas: 'NSImage * noiseBGMainView = [NSImage imageNamed: [[NSBundle mainBundle] pathForResource: @" NoiseBGMainView "deType: @" jpg "]]; \t NSLog (@ "% @", noiseBGMainView); \t NSImageView * bgImageView = [[NSImageView alloc] init]; \t [bgImageView setImage: noiseBGMainView]; [Self addSubview: bgImageView]; ' Toute idée – nanochrome

+1

Si vous configurez NSImageView par programme (au lieu de IB), vous devez lui donner une trame non nulle. Essayez de modifier: NSImageView * bgImageView = [[NSImageView alloc] init]; à: NSImageView * bgImageView = [[NSImageView alloc] initWithFrame: NSMakeRect (0,0,100,100)]; –

+0

Fonctionne bien, mais j'ai besoin de l'image pour répéter? – nanochrome

1
NSURL *pathToBGImage = [[NSURL alloc] initWithString:[[NSBundle mainBundle] pathForResource:@"NoiseBGMainView" ofType:@"jpg"]]; 

Ceci est faux. -[NSURL initWithString:] prend une version chaîne d'une URL, telle que http://apple.com/, pas un nom de chemin. Parce que vous n'avez pas passé une URL, l'URL sera une URL relative, mais une URL relative a besoin d'une base. L'URL est un objet valide, mais ne mène nulle part. Cela, à son tour, provoque initWithContentsOfURL: pour renvoyer nil (parce que vous avez essayé de charger une image à partir d'une URL relative sans base). Vous essayez ensuite de dire à l'image de dessiner, mais vous n'avez pas d'image, donc rien ne se passe.

Vous souhaitez initFileURLWithPath:. (Ou la méthode de classe fileURLWithPath:, avec laquelle vous n'aurez pas à publier l'URL ultérieurement.)