Добавить кнопку в заголовок окна - PullRequest
14 голосов
/ 31 марта 2012

Последние несколько дней я ломал голову над тем, как сделать что-то, что кажется довольно простым.Я искал вокруг, но ничего не могу найти.

Я хочу иметь возможность добавить кнопку ко всем окнам, которые открываются на Mac (она пойдет с правой стороны, напротив "X"кнопки "-" "+").Я считаю, что область, в которую я хочу добавить кнопку, называется заголовком, хотя я не уверен в этом.

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

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

Просто ищу некоторые указатели для этого, где-то, где я могу прочитать об этом, фрагменты кода и просто общие советыЯ возьму все, что угодно.

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

Screenshot

Ответы [ 4 ]

11 голосов
/ 10 мая 2016

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

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

demo window title bar

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

accessory view

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

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

outlet connection

Затем в 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)
}
8 голосов
/ 02 мая 2018

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

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

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

enter image description here

6 голосов
/ 31 марта 2012

Это действительно вопрос из двух частей.Что касается того, как получить кнопку там, я бы предложил использовать -[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 плагин.

0 голосов
/ 25 июня 2019

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]))
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...