2013-01-12 39 views
-2

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

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

在此先感谢

+1

IMO,你不应该试图在第一个地方替换Dock。但是,如果你真的想要隐藏它,看看Kiosk模式 – CodaFi

+1

你是Cocoa的新手,你想立即替换关键系统UI功能之一吗?允许我建议从头开始。 Apple有许多[很好的教程](http://developer.apple.com/library/mac/#referencelibrary/GettingStarted/RoadMapOSX/chapters/01_Introduction.html%23//apple_ref/doc/uid/TP40012262),以及有几本优秀的可可书可以阅读:http://stackoverflow.com/questions/945600/book-recomend-for-learning-cocoa-programming –

+1

@Josiah:提问者确实说过“我对此毫不知情”。如果你不知道该怎么去尝试,你会尝试什么? –

回答

7

有几个关键因素在这里:

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

让我知道如果我错过了任何东西。

+1

哇,彼得,这是一个很棒的描述。我从你的帖子中获得了一些想法,谢谢。 – regulus6633

+0

嗨,彼得,我正在尝试做类似的事情。当用户点击我的按钮时,我会截取所有显示器的屏幕截图,并将其放置在每台显示器的0,0处,然后在其上覆盖一层黑色的暗淡淡入淡出。然后用户可以裁剪。我有一个问题,当用户“延迟10秒”点击我的按钮,然后他们打开另一个应用程序全屏幕,它将工作区滑到全屏应用程序,这是正常的。但是现在,当我的10秒延迟达到0并截取该工作空间时,我希望该窗口能够显示该工作空间(以及所有工作空间),现在将其滚动回原始工作空间。 NSDockLevelWindow没有工作:( – Noitidart

+0

这是我的插件它的火狐,你可以尝试它,请看看我在说什么:https://addons.mozilla.org/en-US/firefox/addon/nativeshot/ – Noitidart