访问 NSColorPanel 的 bottom/custom 颜色

access NSColorPanel's bottom/custom colors

我想阅读 NSColorPanel 底部显示的颜色列表(见下图)。有办法吗?

遗憾的是,没有 public API 可用于从色板访问系统范围内用户提供的颜色。这是一个很老的问题。 NSColorPanel Apple 早就应该进行大修了...

对于未记录的访问(这在沙盒中可能不起作用,如果您计划通过 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 文件中有一个内部版本号,从 10.6 到 10.10 设置为 6。它可能会在未来改变,但你可以通过以下方式或多或少地安全:

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

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

因此,如果第一个框中有一种颜色,右边的框中有另一种颜色,则 colors 数组中将有两个 NSColor 对象,而 NSIndexSet 将包含两个索引,0 和 10。