Закругленные углы NSImage в NSButtonCell

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

Какие-либо предложения?


person Jeena    schedule 30.11.2011    source источник


Ответы (1)


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

person Rob Keniger    schedule 30.11.2011