2015-04-30 2 views

ответ

2

Для незарегистрированного доступа (это не может работать в песочнице и получит ваше приложение отвергается Apple, если вы планируете распространять через App Store):

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 есть внутренний номер версии, который установлен на 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 (или любой номер, который вы декодировали от NSSwatchLayoutNumRows).

Так что если у вас есть цвет в первом поле, а другой цвет в поле справа, вы будете иметь два NSColor объектов в colors массиве, и NSIndexSet будет содержать два индекса, 0 и 10.

+0

работает красиво. Благодарю. – pvinis

1

К сожалению, нет никакого общественного API, для доступа общесистемного предоставленного пользователем цвета из образцов. Это очень старая проблема. NSColorPanel давно пора капитального ремонта от компании Apple ...