Objective c 从NSColor创建NSImage

Objective c 从NSColor创建NSImage,objective-c,cocoa,Objective C,Cocoa,我有一个nspoupbutton,其中包含一个颜色列表。在颜色标题前面,我需要显示一个相同颜色的小框(可能是相同颜色的图像)。因此,我在想,如果我可以使用NSColor(已经存在)创建NSImage,那么我可以使用-[NSMenuItem setImage:方法在弹出按钮的颜色标题前显示图像 那么,如何使用NSColor创建NSImage 也欢迎使用任何其他方法来解决此问题。:) 一个简单的分类方法可以做到这一点 @interface NSImage (ImageAdditions) +(NS

我有一个
nspoupbutton
,其中包含一个颜色列表。在颜色标题前面,我需要显示一个相同颜色的小框(可能是相同颜色的图像)。因此,我在想,如果我可以使用
NSColor
(已经存在)创建
NSImage
,那么我可以使用
-[NSMenuItem setImage:
方法在弹出按钮的颜色标题前显示图像

那么,如何使用
NSColor
创建
NSImage


也欢迎使用任何其他方法来解决此问题。:)

一个简单的分类方法可以做到这一点

@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

[编辑]删除不推荐的API

和上述的swift扩展变量:

import Cocoa

extension NSImage {
  class func swatchWithColor(color: NSColor, size: NSSize) -> NSImage {
    let image = NSImage(size: size)
    image.lockFocus()
    color.drawSwatchInRect(NSRect(origin: .zero, size: size))
    image.unlockFocus()
    return image
  }
}

如果您使用的是AppKit,下面是其他答案的Swift 5便捷初始化版本。遗憾的是,这在UIKit中不起作用,这应该是您正在寻找的:[[1]:
–setScalesWhenResized:
已被弃用。此方法与缓存行为有关。在Mac OS X v10.6及更高版本中,不再需要图像缓存,因此无需更换。