Создание NSImage из NSColor
У меня есть всплывающая кнопка, которая содержит список цветов. Перед заголовком цвета мне нужно отобразить небольшую рамку того же цвета (может быть изображение того же цвета). Итак, я думал о подходе, что если я могу создать объект NSImage, используя объект NSColor (который уже будет присутствовать), то я могу использовать
-(void) setImage:(NSImage *) menuImage
метод класса NSMenuItem для отображения изображения перед цветным заголовком во всплывающей кнопке.
Итак, как я могу выполнить создание объекта NSImage с помощью NSColor?
Любые другие подходы к решению проблемы также приветствуются. :)
Ответы
Ответ 1
Простой метод категории сделает это
@interface NSImage (ImageAdditions)
+(NSImage *)swatchWithColor:(NSColor *)color size:(NSSize)size;
@end
@implementation NSImage (ImageAdditions)
+(NSImage *)swatchWithColor:(NSColor *)color size:(NSSize)size
{
NSImage *image = [[[NSImage alloc] initWithSize:size] autorelease];
[image lockFocus];
[color drawSwatchInRect:NSMakeRect(0, 0, size.width, size.height)];
[image unlockFocus];
return image;
}
@end
[EDIT] удалить устаревший API
Ответ 2
И быстрый вариант расширения выше:
import Cocoa
extension NSImage {
class func swatchWithColor(color: NSColor, size: NSSize) -> NSImage {
let image = NSImage(size: size)
image.lockFocus()
color.drawSwatchInRect(NSMakeRect(0, 0, size.width, size.height))
image.unlockFocus()
return image
}
}
Ответ 3
Вот версия удобного инициализатора Swift 5 других ответов:
extension NSImage {
convenience init(color: NSColor, size: NSSize) {
self.init(size: size)
lockFocus()
color.drawSwatch(in: NSRect(origin: .zero, size: size))
unlockFocus()
}
}
Пример использования:
let redSwatchImage = NSImage(color: .red, size: NSSize(width: 128, height: 128))
Не стесняйтесь менять семантику по мере необходимости :)
Ответ 4
Swift 4
extension NSImage {
class func swatchWithColor(color: NSColor, size: NSSize) -> NSImage {
let image = NSImage(size: size)
image.lockFocus()
color.drawSwatch(in: NSMakeRect(0, 0, size.width, size.height))
image.unlockFocus()
return image
}
}