Вопрос

У меня есть 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top