5

我正在寻找一种解决方案,在 Mac 上用可可做文件图标覆盖(图标标记)(就像 Dropbox 在 Mac 上做的那样)。

有谁知道这样做的方法?

我搜索了 Xcode 文档并查看了scpplugins源代码,这是一种旧的碳代码。

4

5 回答 5

5

有点晚了,但也许会帮助某人。

我用NSWorkspace类解决了同样的问题(请参阅setIcon:forFile:options

基本思路:

  1. 尝试使用QLThumbnailImageCreate预览文件(如果不是 NULL,您将获得缩略图图标)

  2. 如果您没有得到缩略图,则获取文件的默认 OS X 图标(NSWorkspace iconForFile

  3. 将缩略图(或默认图标)与您的徽章相结合

  4. 为文件设置新图标(NSWorkspace setIcon:forFile:options

于 2012-07-11T11:25:58.883 回答
4

由于 Finder 在 Snow Leopard 中进行了重新设计,旧的 Carbon 方法将不再有效。为了能够在 Finder 中标记图标,我采取的方法是编写一个自定义包,然后需要将其注入 Finder。

查看 Wolf Rentzsch 的 mach_inject (https://github.com/rentzsch/mach_star/tree/master/mach_inject) 以便能够将自定义包注入 Cocoa 应用程序。

使用 class-dump 可以查看 Cocoa 应用程序的头文件(例如 Snow Leopard 和 Lion 中的 Finder),以了解您需要在自己的包中覆盖的内容。

于 2012-01-24T16:29:52.690 回答
1

我知道这是一个老问题。

最近有一个实现此功能的库:https ://github.com/liferay/liferay-nativity 。

于 2014-12-24T02:28:19.570 回答
0

NSDockTile使这非常简单:

NSDockTile *dockTile = [NSApp dockTile];
[dockTile setBadgeLabel:@"33"];
于 2011-12-08T12:35:55.167 回答
0

您可以使用以下两种方法在文件夹/文件上覆盖图标。

  1. NSWorkspace如果要在 Mac OS X 中更改文件或文件夹的图标,可以使用 -setIcon:forFile:options: 方法。
    但是,使用此方法应用图标覆盖后,即使您将该文件/文件夹移到外部,覆盖也会退出. 这可能不是确切的解决方案。

  2. 而是在您的应用程序中使用 Finder 同步扩展目标(文件 - 新建 - 目标 - Finder 同步扩展)。
    创建扩展后,您的应用程序将无法与此目标直接通信。为了激活,请使用 AppleScript 命令(我认为没有更好的选择。)

激活

NSString *pluginPath = [[[NSBundle mainBundle] builtInPlugInsPath] stringByAppendingPathComponent:@"yourextension.appex"];

NSString *pluginkitString = [NSString stringWithFormat:@"pluginkit -e use -a \"%@\"", pluginPath];
system([pluginkitString cStringUsingEncoding:NSUTF8StringEncoding]);

一旦激活目标,我们的应用程序可以通过多种方式与该扩展进行通信。其中很少有:

使用NSDistributedNotificationCenter. 此类提供了一种向其他任务中的对象发送通知的方法(如此处的扩展)。

另一种方法是使用:

[[NSUserDefaults alloc] initWithSuiteName:@"teamid.com.company.test"];

您的应用程序和目标都应该有共同的组标识符(即“teamid.com.company.test”)。

为此,在 Target - Capabilities - App Groups 下启用“App Groups”,并提供类似上述的标识符(即“teamid.com.company.test”),teamid 是您将从 Apple 开发人员门户获取的 ID。对您的扩展目标也执行相同的步骤。

在结束之前,请确保扩展程序是否已激活。要检查,请转到系统偏好设置 - 扩展 - 您的应用程序查找器。这是用户可以为您的应用程序启用/禁用图标覆盖的全局点。

于 2017-04-03T11:24:52.897 回答