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 № 1W 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...