Добавьте кнопки в окно Mac. Строки заголовка для всей системы.

Я хочу добавить кнопку в строку заголовка всех окон, которые открываются на Mac.

Кнопка пойдет с правой стороны, напротив кнопок X - +.

Это спрашивается об окнах моего приложения здесь:
Как создать унифицированную панель инструментов в стиле Yosemite в Интерфейсном Разработчике?

Но я хочу, чтобы кнопка отображалась во всех окнах любого приложения, которые открыты на Mac. Очевидно, это произойдет только после того, как пользователь установит эту программу.

Я понимаю, что это, по сути, "подключение к" пользовательскому интерфейсу ОС, но я видел, как другие приложения делают это, и я чувствую, что это выполнимо.

Вот скриншот, где я хочу кнопку:

Screenshot

Ответ 1

Это действительно вопрос из двух частей. Что касается того, как получить кнопку там, Id предлагает использовать -[NSWindow standardWindowButton:] для получения существующей кнопки окна и ее супервизора (то есть строки заголовка):

NSButton *closeButton = [window standardWindowButton:NSWindowCloseButton]; // Get the existing close button of the window. Check documentation for the other window buttons.
NSView *titleBarView = closeButton.superview; // Get the view that encloses that standard window buttons.
NSButton *myButton = …; // Create custom button to be added to the title bar.
myButton.frame = …; // Set the appropriate frame for your button. Use titleBarView.bounds to determine the bounding rect of the view that encloses the standard window buttons.
[titleBarView addSubview:myButton]; // Add the custom button to the title bar.

Включение, вероятно, проще всего сделать как плагин SIMBL.

Ответ 2

Официально поддерживаемый способ добавления кнопки заголовка в OS X 10.10 (Yosemite), а затем - создание NSTitlebarAccessoryViewController и добавив его в свое окно, используя -[NSWindow addTitlebarAccessoryViewController].

Например, у меня есть окно с надписью аксессуаров заголовка:

строка заголовка демонстрационного окна

Чтобы установить это, я начал с добавления отдельного представления к сцене окна контроллера в своем раскадровке. (Вам не нужно использовать раскадровку, но я сделал это в этом проекте.)

вспомогательный вид

Мой аксессуар - это NSView с подтекстом NSButton. Название кнопки использует Font Awesome для отображения кнопки.

Я подключил вид аксессуара к розетке (умно названной accessoryView) в моем подклассе NSWindowController:

выходное соединение

Затем в моем оконном контроллере windowDidLoad я создаю NSTitlebarAccessoryViewController, задаю его свойства и добавлю его в окно:

@IBOutlet var accessoryView: NSView!
var accessoryViewController: NSTitlebarAccessoryViewController?

override func windowDidLoad() {
    super.windowDidLoad()
    createAccessoryViewControllerIfNeeded()
}

fileprivate func createAccessoryViewControllerIfNeeded() {
    guard self.accessoryViewController == nil else { return }
    let accessoryViewController = NSTitlebarAccessoryViewController()
    self.accessoryViewController = accessoryViewController
    accessoryViewController.view = accessoryView
    accessoryViewController.layoutAttribute = .right
    self.window?.addTitlebarAccessoryViewController(accessoryViewController)
}

Ответ 3

Этот ответ обращается к последней Версии Xcode 9.3

  • Перейти к раскадровке.
  • Перетащите панель инструментов в раскадровке в окно.

enter image description here

  • Панель инструментов будет видна под заголовком.

enter image description here

  • Найдите окно на раскадровке

enter image description here

  • Отметьте "Скрыть заголовок" в свойствах окна.

enter image description here

  • Панель инструментов теперь является частью заголовка.

enter image description here

Ответ 4

Swift 4 - в NSWindowController добавьте следующий код

if let window = window {
    let myButton = NSButton()
    myButton.title = "Help"
    myButton.bezelStyle = .rounded

    let titleBarView = window.standardWindowButton(.closeButton)!.superview!
    titleBarView.addSubview(myButton)
    myButton.translatesAutoresizingMaskIntoConstraints = false
    titleBarView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[myButton]-2-|", options: [], metrics: nil, views: ["myButton": myButton]))
    titleBarView.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-1-[myButton]-3-|", options: [], metrics: nil, views: ["myButton": myButton]))
}

Надеюсь, это полезно.