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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top