NSButtonCell中的圆形NSImage角

时间:2011-11-30 21:08:40

标签: macos cocoa nsimage nsbuttoncell

我有一个带有几个NSButton的NSMatrix,它没有Text但只有图像。其中一个图像是从互联网上下载的,我想在我的OS X应用程序中使用圆角。

我找到了一个几乎就是我要找的答案:How to draw a rounded NSImage但遗憾的是当我使用它时它会变得很疯狂:

// 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];
}

问题在于,如果图像是部分透明的(PNG),那么它会完全被破坏,我只会在黑色背景上看到几个白色像素。

如果图像不透明,那么它会得到圆角但旋转180°,我不知道为什么。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

您需要确保在绘制之前正确设置图像的大小,并且应该使用NSImage方法drawInRect:fromRect:operation:fraction:respectFlipped:hints:来确保以正确的方式绘制图像:

- (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];
}

如果这样做,图像应该正确绘制,即使它是半透明的PNG图像。