OS X菜单栏应用程序拖放

时间:2014-03-27 15:45:44

标签: objective-c cocoa nsview menubar nsanimation

我有一个标准的菜单栏应用程序(带有下拉菜单),并希望为我的用户添加能够在我的菜单栏图标上拖动文件的功能(如this)。

你知道这是怎么完成的吗?

我假设我的菜单栏应用程序必须接受拖放操作。但真正让我感到困惑的是弹出视图的动画如此美妙。

任何指针都会非常感激!

2 个答案:

答案 0 :(得分:1)

很简单,你应该制作你的按钮。 您需要一个nsview来通过委托类here进行拖放和单击操作以打开菜单,这样可以提供帮助,并为nsview类引用提供此link

现在您应该将此视图设置为状态按钮:

NSStatusItem *_statusItem;
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
[_statusItem setView:_buttonview];

答案 1 :(得分:0)

从macOS 10.10开始,Apple不赞成更改NSStatusItem的视图。相反,所有自定义行为都应该通过NSStatusItem的.button(NSStatusBarButton)属性进行。

由于我们不应该更改状态项的视图,并且看起来不可以用自己的实现替换掉NSStatusBarButton,所以没有很多“干净”的方式来添加拖放。

但是,您可以覆盖NSStatusBarButton扩展中的拖放功能,如Swift中所示:

extension NSStatusBarButton {

    override open func draggingEntered(_ sender: NSDraggingInfo) -> NSDragOperation {
        print("entered")
        return NSDragOperation()
    }

}

请注意,扩展名中的重载为not technically something that should be done in swift,但是在Obj-C中,它是可以接受的。

您还必须在状态栏按钮上注册拖动的类型。

let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
statusItem.button?.registerForDraggedTypes([.fileURL])