Получить доступ к нижней / пользовательских цветов NSColorPanel

Я хотел бы прочитать список цветов, которые показаны в нижней части NSColorPanel (см. изображение ниже). Есть ли способ сделать это?

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.

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

Другие вопросы по тегам