我想阅读NSColorPanel
底部显示的颜色列表(见下图)。有没有办法做到这一点?
答案 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
,并将该索引与行数一起使用和您可以通过使用键NSSwatchLayoutNumRows
和NSSwatchLayoutNumColumns
解码整数来确定的列。索引集中的 n 索引指的是数组中 n 颜色的位置,索引向下增加。例如,面板中的第一个“颜色框”是索引0,它下面的框是索引1.“索引0”右边的框实际上是索引10(或者从{{1}解码的任何数字})。
因此,如果第一个框中有颜色,右边框中有另一种颜色,则NSSwatchLayoutNumRows
数组中将有两个NSColor
个对象,{{1}将包含两个索引,0和10。
答案 1 :(得分:1)
不幸的是,没有用于从样本访问系统范围的用户提供的颜色的公共API。这是一个非常古老的问题。 NSColorPanel
早就应该对Apple进行大修......