访问 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
,并将该索引集与数字结合使用您可以通过使用键 NSSwatchLayoutNumRows
和 NSSwatchLayoutNumColumns
解码整数来确定行和列的数量。索引集中第n个索引指的是第n个颜色在数组中的位置,索引向下递增。例如,面板中的第一个“颜色框”是索引 0,它下面的框是索引 1。“索引 0”右边的框实际上是索引 10(或者你从 NSSwatchLayoutNumRows
).
因此,如果第一个框中有一种颜色,右边的框中有另一种颜色,则 colors
数组中将有两个 NSColor
对象,而 NSIndexSet
将包含两个索引,0 和 10。
我想阅读 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
,并将该索引集与数字结合使用您可以通过使用键 NSSwatchLayoutNumRows
和 NSSwatchLayoutNumColumns
解码整数来确定行和列的数量。索引集中第n个索引指的是第n个颜色在数组中的位置,索引向下递增。例如,面板中的第一个“颜色框”是索引 0,它下面的框是索引 1。“索引 0”右边的框实际上是索引 10(或者你从 NSSwatchLayoutNumRows
).
因此,如果第一个框中有一种颜色,右边的框中有另一种颜色,则 colors
数组中将有两个 NSColor
对象,而 NSIndexSet
将包含两个索引,0 和 10。