我有一个NSMatrix,其中有几个NSButton,它们没有文本,而只是图像。其中一张图像是从互联网上下载的,我想在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°,我不知道为什么。

有什么建议么?

最佳答案

您需要确保在绘制图像之前正确设置图像的大小,并且应该使用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图像,也应正确绘制图像。

关于macos - NSButtonCell中的圆角NSImage角,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8332963/

10-12 22:32