【问题标题】:making a dock bar [closed]制作停靠栏[关闭]
【发布时间】:2013-01-13 09:09:29
【问题描述】:

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

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

提前致谢

【问题讨论】:

  • IMO,您一开始不应该尝试更换 Dock。但是,如果您真的想隐藏它,请查看 Kiosk 模式
  • 您是 Cocoa 的新手,想要立即替换其中一项关键的系统 UI 功能?请允许我建议从头开始。苹果有很多good tutorials,还有几本优秀的Cocoa书籍你可以阅读:stackoverflow.com/questions/945600/…
  • @Josiah:提问者确实说“我不知道”。如果您不知道该尝试什么,会尝试什么?
  • @PeterHosey,这只是其中的一部分。我也不清楚这里的意图是什么。 OP 是否试图更换扩展坞?创建另一个码头?应用程序中的停靠栏。通常,如果您不知道从哪里开始,您可以提供一些有关如何设置应用程序的相关信息。通常,您认为与流程有关的代码。我在我的一篇博文中介绍了这个想法:infinite-josiah.blogspot.com/2012/12/…

标签: objective-c cocoa


【解决方案1】:

这里有几个关键要素:

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

如果我遗漏了什么,请告诉我。

【讨论】:

  • 哇,彼得,这是一个很棒的描述。我从您的帖子中获得了一些想法,谢谢。
  • 嗨彼得,我正在尝试做类似的事情。当用户单击我的按钮时,我会截取所有监视器的屏幕截图,并将其放置在每个监视器的 0,0 处,然后在其上覆盖黑色暗淡渐变。然后用户可以裁剪。当用户单击我的按钮“延迟 10 秒”时,我遇到了一个问题,然后他们打开另一个应用程序以全屏显示,它将工作区滑动到该全屏应用程序,这是正常的。但是现在当我的 10 秒延迟达到 0 并截取该工作区时,我希望该窗口现在显示在该工作区(以及所有工作区)上,它现在滚动回原始工作区。 NSDockLevelWindow 没有工作:(
  • 这是我的 Firefox 插件,你可以试试看我在说什么:addons.mozilla.org/en-US/firefox/addon/nativeshot
  • @Noitidart:如果可能的话,可以通过设置窗口的collectionBehavior 或与此相关的其他属性之一。您可能想提出一个单独的问题和/或提交一个错误。
  • 感谢彼得的建议!我在这里创建了另一个主题,但我还没有得到任何回复:(stackoverflow.com/questions/31652663/…
猜你喜欢
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
相关资源
最近更新 更多