17

私はNSPopUpButton色のリストを含むを持っています。カラータイトルの前に、同じ色の小さなボックス(おそらく同じ色の画像)を表示する必要があります。NSImageですから、 using NSColorすでに存在する)を作成できれば-[NSMenuItem setImage:]、ポップアップボタンのカラータイトルの前に画像を表示する方法を使用できると考えていました。

NSImageでは、どうすればusingを作成できますNSColorか?

問題を解決するための他のアプローチも歓迎します。:)

4

4 に答える 4

19

単純なカテゴリメソッドはこれを行います

@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を削除

于 2012-06-27T11:28:28.653 に答える
14

AppKitを使用している場合は、他の回答のSwift5コンビニエンス初期化バージョンを次に示します。悲しいことに、これはUIKitでは機能しません

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))

必要に応じてセマンティクスを自由に変更してください

于 2016-11-22T18:16:07.483 に答える
7

そして、上記の迅速な拡張バリアント:

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
  }
}
于 2014-11-01T12:04:03.013 に答える
0

私はこれをやりたかったので、そのための小さなSwiftパッケージを作成しました:SwiftColorSwatches

これは次のように使用されます:

import ColorSwatches

// If you prefer to use a factory initializer on the image type:
let nsImagePurple1 = NSImage.swatch(color: .systemPurple)
let uiImagePurple1 = UIImage.swatch(color: .systemPurple)

// If you prefer to use an instance method on a color instance:
let nsImagePurple2 = NSColor.systemPurple.swatch()
let uiImagePurple2 = UIColor.systemPurple.swatch()

デフォルトが機能しない場合は、これらにサイズを渡すこともできます

于 2021-10-15T22:38:04.900 に答える