Angoli arrotondati NSImage in un NSButtonCell
-
26-10-2019 - |
Domanda
Ho un NSMatrix con un paio di NSButtons in esso che non hanno un testo, ma sono solo le immagini. Una delle immagini viene scaricato da internet e vorrei avere angoli arrotondati nella mia applicazione OS X.
Ho trovato una risposta che quasi è quello che cercavo: Come disegnare un arrotondata NSImage ma purtroppo agisce pazzo quando lo uso:
// 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];
}
Il problema è che se l'immagine è in parte trasparente (PNG), allora è completamente distrutto e vedo solo un paio di pixel bianchi su sfondo nero.
E se l'immagine non è trasparente, allora ottiene gli angoli arrotondati, ma è ruotato di 180 ° e non so perché.
Qualche suggerimento?
Soluzione
È necessario assicurarsi di impostare la dimensione del immagine correttamente prima di disegnare, e si dovrebbe utilizzare il metodo NSImage
drawInRect:fromRect:operation:fraction:respectFlipped:hints:
per garantire l'immagine viene disegnata il modo corretto su:
- (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'immagine dovrebbe elaborare correttamente se si esegue questa operazione, anche se si tratta di un'immagine traslucida PNG.