Question

J'ai un NSMatrix avec deux NSButtons dans ce qui n'ont pas de texte, mais ne sont que des images. L'une des images est téléchargé sur Internet et je voudrais avoir des coins arrondis dans mon application OS X.

J'ai trouvé une réponse qui est à peu près ce que je cherchais: Comment dessiner un arrondie NSImage mais malheureusement, il agit fou quand je l'utilise:

// In my NSButtonCell subclass
- (void)drawImage:(NSImage*)image withFrame:(NSRect)imageFrame inView:(NSView*)controlView
{
    // [super drawImage:image withFrame:imageFrame inView:controlView];

    [NSGraphicsContext saveGraphicsState];

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:imageFrame xRadius:5 yRadius:5];
    [path addClip];

    [image drawInRect:imageFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

    [NSGraphicsContext restoreGraphicsState];
}

Le problème est que, si une image est partiellement transparent (PNG), il est complètement détruit et je vois seulement un couple de pixels blancs sur un fond noir.

Et si l'image est transparente alors il obtient les coins arrondis, mais est mis en rotation à 180 ° et je ne sais pas pourquoi.

Toutes les suggestions?

Était-ce utile?

La solution

Vous devez vous assurer que vous définissez correctement la taille de l'image avant de tirer, et vous devez utiliser la méthode NSImage drawInRect:fromRect:operation:fraction:respectFlipped:hints: pour assurer l'image est tirée dans le bon sens:

- (void)drawImage:(NSImage*)image withFrame:(NSRect)imageFrame inView:(NSView*)controlView
{
    // [super drawImage:image withFrame:imageFrame inView:controlView];

    [NSGraphicsContext saveGraphicsState];

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:imageFrame xRadius:5 yRadius:5];
    [path addClip];

    //set the size
    [image setSize:imageFrame.size];

    //draw the image
    [image drawInRect:imageFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];

    [NSGraphicsContext restoreGraphicsState];
}

L'image doit tirer correctement si vous faites cela, même si elle est une image PNG translucide.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top