-2

我想制作一个包含应用程序图标的停靠栏。如果我单击任何图标,则该应用程序应该午餐,我如何隐藏该停靠栏?

我是可可的新手,我对此一无所知。所以任何人都可以给我基本的想法。

提前致谢

4

1 回答 1

7

这里有几个关键要素:

  • 就像屏幕上的几乎所有其他内容一样,您的 Dock 必须位于窗口中。据推测,您并没有想象一个带有标准框架(标题栏、交通灯和调整大小手柄)的窗口,因此您需要一个无边框的窗口。它必须在一个特定的窗口级别,即这个
  • 每个图标都是一个以 开头的按钮。您可以将其演变为能够弹跳、显示运行状态(就像 Dock 使用其 LED 一样)等的自定义视图。
  • Dock 使用三种项目填充自身:正在运行的应用程序、已添加书签的应用程序(即使在运行时仍保留在 Dock 中的应用程序)和已添加书签的文件(文档、文件夹等)。应用程序位于分隔线的左侧;书签文件和垃圾箱在右侧。
  • 说到垃圾箱,如果需要,您需要使用FSEvents来检测任何垃圾箱何时变为非空,NSWorkspace 或 Finder 的 Apple 事件来打开垃圾箱,以及 Finder 的 Apple 事件来清空它.
  • 当用户单击未运行的已添加书签的应用程序时,您将使用NSWorkspace启动该应用程序。
  • 对于已经在运行的应用程序,您需要激活它们(如果尚未激活)或“重新打开”它们(如果已经激活)。我首先尝试启动它们,看看这是否在所有三种情况下都是正确的;如果没有,那么您可以在必要时自己发送 Apple 事件。
  • 书签文件夹可以在 Dock 中使用以下三个 UI 之一进行浏览:列表(菜单)、网格(集合视图)和“风扇”。菜单很容易制作,但我不确定如何制作弹出式菜单。网格 UI 将是HUD 样式的popover中的集合视图。“风扇”完全是自定义的,在弹出窗口中。
  • 您需要检测应用程序何时启动和终止,以便将它们添加到您的 Dock(如果还没有作为书签存在)并从中删除它们(如果它们没有添加书签)。NSWorkspace 对此有通知。
  • 您可能无法获得应用程序的自定义 Dock 菜单。这都是 Apple 的 Dock 和 AppKit 之间的私有内容。
  • 同样,祝您好运实现“分配到桌面”菜单项。
  • 每个应用程序的 Dock 菜单中的其他命令对应于 NSRunningApplication 方法。
  • 您还需要处理 Dock 图标视图中的拖放,以启用重新排序和处理用户将项目拖出 Dock 以取消标记它们。记住要处理取消对正在运行的应用程序添加书签的情况(Dock 确实取消了对它的书签,但因为它仍在运行,所以将应用程序重新定位到原位)。取消书签时,当用户放下它时播放噗的效果。
  • 当用户 ⌘ 将任何项目拖出 Dock 时,拖动该项目所代表的文件。这不适用于 Finder(在 Apple 的 Dock 中——如果需要,您可以这样做)或 Trash(它不代表单个项目)。不要从 Dock 中移除该项目。
  • 而且,另一方面,当且仅当由图标表示的项目可以接收该拖动时,您应该在用户拖动图标时突出显示该图标。
    • 当用户将文件拖到应用程序时,如果所有文件的类型都在应用程序的文档类型中,则突出显示它。通过使用 NSWorkspace 以使用该应用程序打开文件 URL 来完成拖动。
    • 当用户将非文件 URL 拖到应用程序时,如果所有 URL 的方案都在应用程序的 URL 方案中,则突出显示它。通过使用 NSWorkspace 打开该应用程序的 URL 来完成拖动。
    • 当用户将内容拖动到应用程序时,如果该应用程序具有可以处理拖动粘贴板上任何内容类型的服务,则突出显示该内容。通过调用该服务来完成它。(我不知道有一个公共 API 可以对特定的应用程序执行此操作——您只需要使用服务名称并希望获得最好的结果。)
    • 当用户将文件拖到文件夹时,如果该文件夹可写或包含任何文件夹,则突出显示该文件夹。如果用户在此处停留了一定时间,请在 Finder 中打开文件夹(此功能称为弹簧加载文件夹)。如果用户将文件放在 Dock 中的文件夹上,则通过将文件移动或复制到文件夹中来完成拖动,或者通过在文件夹中为它们创建别名来完成拖动,具体取决于修饰键的状态。
    • 垃圾箱的文件也是如此,但您需要为每个文件确定正确的垃圾箱。如果文件位于主文件夹中,则正确的废纸篓是主文件夹的废纸篓。否则,它是文件所在卷的卷级垃圾箱。
    • 当用户将任何卷拖到废纸篓时,将其图标更改为“弹出”图标(kEjectMediaIcon与 一起使用iconForFileType:)。通过弹出卷来完成拖动。如果用户完成拖拽、取消拖拽或拖离垃圾箱,则将垃圾箱的图标变回来。
  • 哦,您需要处理项目之间的拖动,包括在分隔线之前和之后,以添加项目。这将与我上面提到的拖动重新排序重叠。
  • 对于自动隐藏,您需要在承载 Dock 的屏幕边缘(通常是第一个屏幕,如果有的话)。当用户将鼠标悬停在此窗口上时,显示 Dock(它应该覆盖薄窗口)。当用户将鼠标移出 Dock 时,将其隐藏。
  • Dock 有一个上下文菜单,其中包含在其分隔符上的各种选项。
  • 理想情况下,您应该期待在某个时候支持主题,因为 Dock 已经至少有两个主题(默认的“玻璃”主题和 2D HUD 风格的主题)。

如果我错过了什么,请告诉我。

于 2013-01-12T20:20:50.063 回答