Я хотів би прочитати список кольорів, які показані внизу поля NSColorPanel
(див. зображення нижче). Чи є спосіб це зробити?
Відповіді:
2 для відповіді № 1Для бездокументованого доступу (це може не працювати в пісочниці та Apple відхилить вашу програму від 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"];
The colors
Масив буде містити NSColor
об’єкти кольорової панелі.
Це працює аж до OS X 10.6. Це може працювати і на більш ранніх версіях, але вам потрібно буде отримати ім’я файлу по-іншому (оскільки URLsForDirectory:inDomains:
було введено в 10.6). Всередині NSColorPanelSwatches.plist
file - внутрішній номер версії, на який встановлено 6
за 10,6 прямо до 10.10. Це може змінитися в майбутньому, але ви можете бути більш-менш безпечними, зробивши:
if ([unarchiver decodeIntForKey:@"NSSwatchFileVersion"] == 6)
{
NSArray *colors = [unarchiver objectForKey:@"NSSwatchColorArray"];
// do something with colors
}
else
{
NSLog(@"System unsupported");
}
Якщо вас цікавить, де розташовані кольори, ви можете розшифрувати NSIndexSet
від викидача, використовуючи NSSwatchColorIndexes
ключ і використовувати цей набір індексів у поєднанні з кількістю рядків і стовпців, які можна визначити, розшифрувавши цілі числа за допомогою ключів NSSwatchLayoutNumRows
і NSSwatchLayoutNumColumns
. The нth індекс у наборі індексів відноситься до місця розташування нкольори в масиві та індекси збільшуютьсявниз. Наприклад, перше "кольорове поле" на панелі - це індекс 0, а поле під ним - індекс 1. Поле справа від "індексу 0" - це фактично індекс 10 (або будь-яке число, з якого ви розшифрували NSSwatchLayoutNumRows
)
Отже, якщо ви маєте колір у першому полі, а інший колір у вікні праворуч, у вас буде два NSColor
об'єкти в colors
масив та NSIndexSet
міститиме два індекси, 0 і 10.
1 для відповіді № 2
На жаль, не існує публічних API для доступу до наданих користувачем кольорів із зразків. Це дуже старе питання. NSColorPanel
давно назріла для капітального ремонту від Apple ...