3

I would like to read the list of colors that are shown on the bottom of the NSColorPanel (see image below). Is there a way to do this?

4

2 回答 2

2

对于未记录的访问(如果您计划通过 App Store 分发,这可能无法在沙箱中工作,并且会导致您的应用被 Apple 拒绝):

NSArray *libraries = [[NSFileManager defaultManager] URLsForDirectory:NSLibraryDirectory inDomains:NSAllDomainsMask];
NSURL *url = [[libraries objectAtIndex:0] URLByAppendingPathComponent:@"Colors/NSColorPanelSwatches.plist"];
NSData *fileData = [NSData dataWithContentsOfURL:url];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:fileData];

NSArray *colors = [unarchiver decodeObjectForKey:@"NSSwatchColorArray"];

然后该colors数组将包含NSColor颜色面板的对象。

这可以追溯到 OS X 10.6。它也可能适用于早期版本,但您需要以不同的方式获取文件名(因为URLsForDirectory:inDomains:在 10.6 中引入)。该NSColorPanelSwatches.plist文件内部是一个内部版本号,从610.6 一直设置为 10.10。它可能会在未来发生变化,但您可以通过以下方式或多或少地安全:

if ([unarchiver decodeIntForKey:@"NSSwatchFileVersion"] == 6)
{
    NSArray *colors = [unarchiver objectForKey:@"NSSwatchColorArray"];
    // do something with colors
}
else
{
    NSLog(@"System unsupported");
}

如果您对颜色的位置感兴趣,您可以NSIndexSet使用键从 unarchiver中解码一个,并将该索引集与您可以通过使用键和NSSwatchColorIndexes解码整数来确定的行数和列数结合使用. 索引集中的第n个索引是指数组中第n个颜色的位置,索引向下增加。例如,面板中的第一个“颜色框”是索引 0,它下面的框是索引 1。“索引 0”右侧的框实际上是索引 10(或您解码的任何数字)。NSSwatchLayoutNumRowsNSSwatchLayoutNumColumnsNSSwatchLayoutNumRows

因此,如果您在第一个框中有一种颜色,而在右边的框中有另一种颜色,那么您将在数组中有两个NSColor对象,并且将包含两个索引,0 和 10。colorsNSIndexSet

于 2015-05-01T00:07:56.557 回答
1

不幸的是,没有公共 API 可以从样本中访问系统范围内的用户提供的颜色。这是一个非常古老的问题。NSColorPanel早就应该从Apple进行大修了……

于 2015-04-30T21:05:35.857 回答