Округлые углы NSImage в NSButtonCell
-
26-10-2019 - |
Вопрос
У меня есть NSMatrix с парой NSButtons, которые не имеют текста, но являются только изображениями. Одно из изображений загружается из Интернета, и я хотел бы, чтобы они закруглились в моем приложении OS X.
Я нашел один ответ, который почти то, что я искал: Как нарисовать округлый 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.