Я хотел бы прочитать список цветов, которые показаны в нижней части NSColorPanel
(см. Рисунок ниже). Есть ли способ сделать это?Доступ к нижним/пользовательским цветам NSColorPanel
ответ
Для незарегистрированного доступа (это не может работать в песочнице и получит ваше приложение отвергается 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 ...
работает красиво. Благодарю. – pvinis