Приложение OS X Menubar с перетаскиванием

У меня есть стандартное приложение menubar (с выпадающим меню), и я хотел бы добавить возможность пользователям перетаскивать файлы поверх иконки menubar (например, так).

Вы знаете, как это достигается?

Я предполагаю, что мое приложение menubar должно принимать перетаскивание. Но что меня действительно смущает, так это то, как всплывающее представление анимировано так красиво.

Любые указатели будут высоко оценены!

1 ответ

Это просто, вы должны сделать свою кнопку. Вам нужен nsview, чтобы сделать действие перетаскивания и щелчка для открытия меню по классу делегата. Вот пример, который может помочь, и эта ссылка для ссылки на класс nsview.

Теперь вы должны установить этот вид на кнопку состояния:

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

Начиная с macOS 10.10, Apple не одобряла изменение представления NSStatusItem. Вместо этого все пользовательское поведение должно проходить через свойство.button (NSStatusBarButton) объекта NSStatusItem.

Поскольку мы не должны изменять вид элемента состояния, и не похоже, что вы можете заменить NSStatusBarButton собственной реализацией, для "чистых" способов добавления перетаскивания не так уж много.

Однако вы можете переопределить функцию перетаскивания в расширении NSStatusBarButton, как показано в Swift:

extension NSStatusBarButton {

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

}

Обратите внимание, что переопределение в расширениях технически не то, что должно быть сделано в swift, но в Obj-C это может быть приемлемо.

Вам также придется зарегистрироваться для перетаскиваемых типов на кнопке строки состояния.

let statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
statusItem.button?.registerForDraggedTypes([.fileURL])
Другие вопросы по тегам