Закругленные углы NSImage в NSButtonCell - PullRequest
1 голос
/ 01 декабря 2011

У меня есть 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 °, и я не знаю почему.

Есть предложения?

1 Ответ

3 голосов
/ 01 декабря 2011

Необходимо убедиться, что вы правильно установили размер изображения перед его рисованием, и вы должны использовать метод 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.

...