Esquinas redondeadas de nsimage en un nsbuttoncell
-
26-10-2019 - |
Pregunta
Tengo una nsmatrix con un par de nsbutton que no tienen texto pero son solo imágenes. Una de las imágenes se descarga de Internet y me gustaría tenerlas esquinas redondeadas en mi aplicación OS X.
Encontré una respuesta que casi es lo que estaba buscando: Cómo dibujar una Nsimage redondeada Pero lamentablemente actúa locamente cuando 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];
}
El problema es que si una imagen es parcialmente transparente (PNG), entonces se destruye completamente y solo veo un par de píxeles blancos en un fondo negro.
Y si la imagen no es transparente, entonces obtiene las esquinas redondeadas, pero se gira 180 ° y no sé por qué.
¿Alguna sugerencia?
Solución
Debe asegurarse de establecer el tamaño de la imagen correctamente antes de dibujarlo, y debe usar el NSImage
método drawInRect:fromRect:operation:fraction:respectFlipped:hints:
Para asegurarse de que la imagen esté dibujada de la manera correcta:
- (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];
}
La imagen debe dibujar correctamente si hace esto, incluso si se trata de una imagen PNG translúcida.