/ / доступ до нижнього / користувальницького кольору NSColorPanel - макос, какао, nscolorpanel

доступ до NSColorPanel в нижній / користувальницькі кольори - макроси, какао, nscolorpanel

Я хотів би прочитати список кольорів, які показані внизу поля 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 ...