macos - 访问 NSColorPanel 的底部/自定义颜色

标签 macos cocoa nscolorpanel

我想阅读 NSColorPanel 底部显示的颜色列表(见下图)。有办法做到这一点吗?

最佳答案

对于无证访问(这可能无法在沙箱中运行,如果您计划通过 App Store 分发,您的应用程序将被 Apple 拒绝):

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 文件内有一个内部版本号,从 10.6 到 10.10,该版本号设置为 6。 future 可能会发生变化,但您可以通过以下方式或多或少地安全:

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

如果您对颜色的位置感兴趣,可以使用 NSSwatchColorIndexes 键从解档器中解码 NSIndexSet,并使用该索引集与行数和列数结合使用,您可以通过使用键 NSSwatchLayoutNumRowsNSSwatchLayoutNumColumns 解码整数来确定行数和列数。索引集中的第n个索引指的是数组中第n个颜色的位置,索引向下递增。例如,面板中的第一个“颜色框”是索引 0,它下面的框是索引 1。“索引 0”右侧的框实际上是索引 10(或者从 NSSwatchLayoutNumRows 解码的任何数字) )。

因此,如果第一个框中有一种颜色,右侧框中有另一种颜色,则 colors 数组中将有两个 NSColor 对象, NSIndexSet 将包含两个索引:0 和 10。

关于macos - 访问 NSColorPanel 的底部/自定义颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29972161/

相关文章:

objective-c - NSButton 子类为 colorwell 并防止 NSColorPanel 接触第一响应者

python - 用pip安装Django,找不到django-admin

osx 上的 python/pip 错误

cocoa-touch - 是否有必要始终在 block 内使用对 self 的弱引用..?

ios - 如何比较 NSAttributedString 的属性?

macos - Mac OS X/iOS : How to write indexed PNG image using RGBA colours through CGImage?

objective-c - 将不透明度 slider 添加到颜色面板,以获得一种颜色而不是其他颜色

linux - 用于创建新选项卡以运行 bash 命令的 Apple 脚本

objective-c - 将按钮添加到 OSX 锁定屏幕