/ / dostęp do dolnych / niestandardowych kolorów NSColorPanel - macos, kakao, nscolorpanel

dostęp do dolnych / niestandardowych kolorów NSColorPanel - macos, kakao, nscolorpanel

Chciałbym przeczytać listę kolorów, które są pokazane na dole NSColorPanel (patrz obrazek poniżej). Czy jest na to sposób?

Odpowiedzi:

2 dla odpowiedzi № 1

W przypadku nieudokumentowanego dostępu (może to nie działać w piaskownicy i spowoduje odrzucenie Twojej aplikacji przez Apple, jeśli planujesz dystrybucję za pośrednictwem 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 tablica będzie wtedy zawierała NSColor obiekty panelu kolorów.

Działa to już w OS X 10.6. Może działać również na wcześniejszych wersjach, ale będziesz musiał uzyskać inną nazwę pliku (ponieważ URLsForDirectory:inDomains: został wprowadzony w 10.6). W środku NSColorPanelSwatches.plist plik to wewnętrzny numer wersji ustawiony na 6 od 10.6 aż do 10.10. Może się to zmienić w przyszłości, ale możesz być mniej lub bardziej bezpieczny, wykonując:

if ([unarchiver decodeIntForKey:@"NSSwatchFileVersion"] == 6)
{
NSArray *colors = [unarchiver objectForKey:@"NSSwatchColorArray"];
// do something with colors
}
else
{
NSLog(@"System unsupported");
}

Jeśli interesuje Cię, gdzie znajdują się pozycje kolorów, możesz rozszyfrować NSIndexSet z unarchiver za pomocą NSSwatchColorIndexes i użyj tego zestawu indeksów w połączeniu z liczbą wierszy i kolumn, które możesz określić, dekodując liczby całkowite za pomocą klawiszy NSSwatchLayoutNumRows i NSSwatchLayoutNumColumns. The n-ty indeks w zbiorze indeksów odnosi się do lokalizacji nkolor w tablicy i indeksy rosnąku dołowi. Na przykład pierwsze „kolorowe pole” w panelu ma indeks 0, a pole pod nim to indeks 1. Pole na prawo od „indeksu 0” ma w rzeczywistości indeks 10 (lub inny numer, z którego zdekodowałeś NSSwatchLayoutNumRows).

Więc jeśli masz kolor w pierwszym polu i inny kolor w polu po prawej, będziesz miał dwa NSColor obiekty w colors tablica i NSIndexSet będzie zawierał dwa indeksy, 0 i 10.


1 dla odpowiedzi nr 2

Niestety nie ma publicznych interfejsów API umożliwiających dostęp do kolorów dostarczanych przez użytkownika z próbek w całym systemie. To bardzo stary problem. NSColorPanel jest już dawno spóźniony na remont firmy Apple...