访问NSColorPanel的底部/自定义颜色

时间:2015-04-30 15:44:14

标签: macos cocoa nscolorpanel

我想阅读NSColorPanel底部显示的颜色列表(见下图)。有没有办法做到这一点?

2 个答案:

答案 0 :(得分: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。它也可能适用于早期版本,但您需要以不同方式获取文件名(因为在{10}中引入了URLsForDirectory:inDomains:)。 NSColorPanelSwatches.plist文件内部是一个内部版本号,设置为6 10.6直到10.10。它可能会在未来发生变化,但通过这样做可能会或多或少地安全:

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

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

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

答案 1 :(得分:1)

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