2012-03-31 30 views
7

He estado trabajando en mi cerebro durante los últimos días sobre cómo hacer algo que parece bastante simple. He buscado pero no encuentro nada.Agregar botón a la barra de título de la ventana

Quiero poder agregar un botón a todas las ventanas que se abren en un mac (irá en el lado derecho, frente a los botones "X" "-" "+"). Creo que el área al que deseo agregar el botón se llama la barra de título, aunque no estoy seguro de esto.

Parece que no puedo encontrar la forma de hacerlo en el constructor de interfaces. Pero incluso si lo hiciera, quiero que el botón aparezca en todas las ventanas que se abren en el Mac (obviamente una vez que el usuario ha instalado este programa).

Entiendo que esto es esencialmente "conectar" la interfaz de usuario del sistema operativo, pero he visto otras aplicaciones hacer esto, lo que me hace sentir que es capaz de hacerlo.

Solo buscando algunos consejos para esto, en algún lugar que pueda leer sobre él, fragmentos de código y solo consejos generales, tomaré cualquier cosa.

Aquí es donde quiero pantalla el botón:

Screenshot

+0

Solo tenga cuidado donde lo agregue: los usuarios con Mac OS X 10.7 y superior tendrán un botón de "Pantalla completa" en el lado derecho. Asegúrate de que tu botón se mueva un poco hacia la izquierda. –

+0

Una pregunta relacionada útil: http: // stackoverflow.com/questions/3833241/adding-secondary-text-to-window-title-bar-in-cocoa –

Respuesta

6

Esta es realmente una pregunta de dos partes. En cuanto a cómo conseguir un botón ahí arriba, me gustaría sugerir el uso de -[NSWindow standardWindowButton:] para obtener un botón de ventana existente y su supervista (es decir, la barra de título):

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. 

El taponamiento-in es probablemente más fácil de hacer como una SIMBL plug-in.

+0

¿Esto funcionaría en todos los programas instalados? – JoePasq

+0

Por lo que puedo decir, usar NSWindowCloseButton y similar se usa para decidir si mostrar o no los botones estándar. La API no es muy útil aquí, no me dice qué devolvería el método ni nada. Lo que quiero decir es que no estoy seguro de cómo usaría el estándarWindowButton:] para colocar mis propios botones, parece ser para editar los existentes. – Timsk

+0

La API devuelve los botones solicitados. Puedes usarlo para ocultarlos, pero no es necesario. En el ejemplo, se usa un botón de ventana existente para encontrar la vista que encierra los botones de ventana estándar (es decir, la vista de la barra de título). Expandí mi ejemplo y agregué comentarios. No estoy muy seguro de a qué te refieres con "no me dice qué devolvería el método ni nada". La referencia de la clase NSWindow [claramente lo hace] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/occ/instm/ NSWindow/standardWindowButton :). – gcbrueckmann

7

La forma oficialmente compatible para agregar un botón de la barra de título en OS X 10.10 (Yosemite) y más tarde es creando un NSTitlebarAccessoryViewController y agregándolo a su ventana usando -[NSWindow addTitlebarAccessoryViewController].

Por ejemplo, tengo una ventana que tiene una vista accesorio de la barra de título:

demo window title bar

Para hacer esto, empecé añadiendo un punto de vista independiente de la escena controlador de ventana de mi guión. (Usted no tiene que utilizar un guión, pero lo hice en este proyecto.)

accessory view

Mi punto de vista es un accesorio NSView con una subvista NSButton. El título del botón utiliza Font Awesome para mostrar la chincheta.

que conecta el punto de vista de accesorios a una salida (ingeniosamente llamado accessoryView) en mi NSWindowController subclase:

outlet connection

Luego, en la windowDidLoad, creo el NSTitlebarAccessoryViewController, puesto mi controlador ventana de sus propiedades, y añadir a la ventana:

@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) 
} 
Cuestiones relacionadas