Подтвердить что ты не робот

Создание NSImage из NSColor

У меня есть всплывающая кнопка, которая содержит список цветов. Перед заголовком цвета мне нужно отобразить небольшую рамку того же цвета (может быть изображение того же цвета). Итак, я думал о подходе, что если я могу создать объект NSImage, используя объект NSColor (который уже будет присутствовать), то я могу использовать

-(void) setImage:(NSImage *) menuImage

метод класса NSMenuItem для отображения изображения перед цветным заголовком во всплывающей кнопке.

Итак, как я могу выполнить создание объекта NSImage с помощью NSColor?
Любые другие подходы к решению проблемы также приветствуются. :)

4b9b3361

Ответ 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
    }
}