制作码头吧

时间:2013-01-12 18:09:15

标签: objective-c cocoa

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

我是可可的新手,我不知道。 所以任何人都可以给我基本的想法。

提前致谢

1 个答案:

答案 0 :(得分:7)

这里有几个关键要素:

  • 与屏幕上几乎所有其他内容一样,您的Dock必须在窗口中。据推测,你并没有想象一个标准框架(标题栏,红绿灯和调整大小手柄)的窗口,所以你想要一个无边框窗口。它必须是特定的window level,即this one
  • 每个图标都是一个按钮to start with。您可以将其演变为能够弹跳的自定义视图,显示运行状态(如Dock与其LED一样)等。
  • Dock使用三种项目填充自己:Running applications,书签应用程序(即使在运行时仍保留在Dock中的应用程序),以及书签文件(文档,文件夹等)。应用程序位于分隔符的左侧;带有书签的文件和垃圾桶就在右侧。
  • 说到垃圾箱,如果您需要,您需要使用FSEvents来检测任何垃圾箱何时变为非空,NSWorkspace或Apple事件到Finder打开垃圾箱,以及向Finder发送Apple事件以清除它。
  • 当用户点击未运行的已添加书签的应用时,您将使用NSWorkspace启动该应用。
  • 对于已经运行的应用程序,您需要激活它们(如果尚未激活)或“重新打开”它们(如果已经激活)。我首先尝试启动它们,看看在所有三种情况下是否做到了正确的事情;如果它没有,那么你可以在必要时自己发送Apple Events。
  • 可以使用以下三个UI之一在Dock中读取已添加书签的文件夹:列表(菜单),网格(集合视图)和“粉丝”。菜单很容易制作,但我不确定如何制作一个popover风格。网格UI将是HUD样式collection view中的popover。 “粉丝”完全是定制的,在popover中。
  • 您需要检测应用程序启动和终止的时间,以便将它们添加到您的Dock(如果尚未作为书签),并将其从中删除(如果它们没有加入书签)。 NSWorkspace有此通知。
  • 您可能无法获得应用程序'自定义Dock菜单。这是Apple的Dock和AppKit之间的所有私密内容。
  • 同样,祝您实施“分配到桌面”菜单项。
  • 每个应用程序的Dock菜单中的其他命令对应于NSRunningApplication方法。
  • 您还希望在Dock图标视图中处理拖放操作,以启用重新排序并处理用户从Dock中拖出项目以取消对其进行书签。请记住处理对正在运行的应用程序取消书签的情况(Dock会取消对其进行书签,但会将应用程序重新锁定到位,因为它仍在运行)。取消书签时,请在用户放弃时播放poof effect
  • 当用户⌘-拖出Dock中的任何项目时,请拖动该项目所代表的文件。这不适用于Finder(在Apple的Dock中 - 如果需要,可以执行此操作)或“废纸篓”(它不代表单个项目)。请勿从Dock中移除该项目。
  • 另一方面,当用户拖动图标时,您应突出显示一个图标,当且仅当图标所代表的项目可以接收该拖动时。
    • 当用户将文件拖动到某个应用程序时,如果所有文件都突出显示该文件。类型属于应用程序的文档类型。使用NSWorkspace打开该应用程序的文件URL,完成拖动。
    • 当用户将非文件网址拖动到某个应用程序时,如果所有网址都被突出显示,则会突出显示该网址。方案是应用程序的URL方案之一。使用NSWorkspace打开包含该应用程序的URL,完成拖动。
    • 当用户将内容拖动到应用程序时,如果应用程序具有可以处理拖动粘贴板上的任何内容类型的服务,请突出显示该内容。通过调用该服务来完成它。 (我不知道使用特定应用程序执行此操作的公共API - 您只需使用服务名称并希望获得最佳效果。)
    • 当用户将文件拖到文件夹时,如果文件夹可写或包含任何文件夹,请将其高亮显示。如果用户在那里悬停一段时间,请在Finder中打开该文件夹(此功能称为弹簧加载文件夹)。如果用户删除Dock中文件夹上的文件,请通过将文件移动或复制到文件夹来完成拖动,或者根据修改键的状态在文件夹中创建别名。
    • 同样适用于垃圾箱的文件,但您需要为每个文件确定正确的垃圾箱。如果文件位于主文件夹中,则正确的“废纸篓”是“主页”文件夹的“废纸篓”。否则,它是文件所在卷的卷级垃圾。
    • 当用户将任何音量拖动到“废纸篓”时,将其图标更改为“弹出”图标(kEjectMediaIcon,与iconForFileType:一起使用)。通过弹出音量来完成拖动。如果用户完成拖动操作,取消拖动操作或拖离垃圾箱,请更改垃圾箱的图标。
  • 哦,你需要处理在项之间拖动,包括分隔符之前和之后,添加项目。这将与拖动重叠,以重新排序我上面提到的。
  • 对于自动隐藏,你需要有一个1磅高/宽的无边框窗口,其宽度/高度与实际Dock相同,位于屏幕边缘的Dock(通常是第一个screen,如果有的话)。当用户将鼠标悬停在此窗口上时,显示Dock(应该覆盖瘦窗口)。当用户将鼠标移动到Dock外部时,将其隐藏。
  • Dock有一个上下文菜单,其中包含分隔符上的各种选项。
  • 理想情况下,您应该预期在某些时候支持主题,因为Dock已经至少有两个主题(默认的“玻璃”主题和2D HUD风格的主题)。

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