2012-03-31 9 views
7

Ich habe mir in den letzten paar Tagen den Kopf zerbrochen, wie ich etwas tun kann, das ganz einfach zu sein scheint. Ich habe gesucht, kann aber nichts finden.Schaltfläche zum Fenster title bar hinzufügen

Ich möchte in der Lage sein, eine Schaltfläche zu allen Fenstern hinzufügen, die auf einem Mac öffnen (es wird auf der rechten Seite, gegenüber den "X" "-" "+" Schaltflächen gehen). Ich glaube, der Bereich, dem ich den Button hinzufügen möchte, heißt Titelleiste, obwohl ich mir da nicht sicher bin.

Ich kann nicht scheinen, eine Möglichkeit zu finden, dies in Interface Builder zu tun. Aber selbst wenn ich das täte, möchte ich, dass die Schaltfläche in allen Fenstern erscheint, die auf dem Mac geöffnet sind (natürlich sobald der Benutzer dieses Programm installiert hat).

Ich verstehe, dass dies im Wesentlichen "Plug-In" in der Benutzeroberfläche des Betriebssystems ist, aber ich habe gesehen, andere Anwendungen dies tun, die mich fühlen, dass es möglich ist.

Nur auf der Suche nach einigen Zeigern, irgendwo kann ich darüber nachlesen, Code-Schnipsel und nur allgemeine Hinweise, ich nehme alles.

Hier Screenshot, wo ich den Knopf wollen:

Screenshot

+0

Seien Sie einfach vorsichtig, wo Sie es hinzufügen - Benutzer mit Mac OS X 10.7 und höher haben einen "Fullscreen" -Button auf der rechten Seite. Stellen Sie sicher, dass Ihre Schaltfläche ein wenig nach links verschoben ist. –

+0

Eine nützliche verwandte Frage: http: // stackoverflow.com/questions/3833241/adding-secondary-text-to-window-titel-bar-in-cocoa –

Antwort

6

Das ist wirklich eine zweiteilige Frage. Was, wie oben eine Taste um dorthin zu gelangen, würde ich mit -[NSWindow standardWindowButton:] vorschlägt eine existierende Fenster-Taste und seine Superview (dh der Titelleiste) zu erhalten:

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. 

Die Plugging-in ist wahrscheinlich am einfachsten als einen zu tun SIMBL Plug-in.

+0

Würde dies auf allen installierten Programmen funktionieren? – JoePasq

+0

Soweit ich das beurteilen kann, wird mit NSWindowCloseButton und ähnlichem entschieden, ob die Standardschaltflächen angezeigt werden sollen oder nicht. Die API ist hier nicht sehr hilfreich, sagt mir nicht, was die Methode zurückgeben würde oder so. Was ich meine ist, ich bin mir nicht sicher, wie ich den StandardWindowButton verwenden würde:] um meine eigenen Schaltflächen zu platzieren, scheint es für die Bearbeitung der vorhandenen zu sein. – Timsk

+0

Die API gibt die angeforderten Schaltflächen zurück. Sie können es benutzen, um sie zu verstecken, aber Sie brauchen es nicht. In dem Beispiel wird eine vorhandene Fensterschaltfläche verwendet, um die Ansicht zu finden, die die Standardfensterschaltflächen (d. H. Die Titelleistenansicht) einschließt. Ich habe mein Beispiel erweitert und Kommentare hinzugefügt. Ich bin nicht ganz sicher, was du meinst "sagt mir nicht, was die Methode zurückgeben würde oder irgendetwas". Die NSWindow-Klassenreferenz [macht dies eindeutig] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/occ/instm/ NSWindow/standardWindowButton :). – gcbrueckmann

7

Die offiziell unterstützte Möglichkeit zum Hinzufügen einer Titelleistenschaltfläche in OS X 10.10 (Yosemite) und höher besteht darin, NSTitlebarAccessoryViewController zu erstellen und mithilfe von -[NSWindow addTitlebarAccessoryViewController] zu Ihrem Fenster hinzuzufügen.

Zum Beispiel habe ich ein Fenster, das eine Titelleiste Zubehör Blick hat:

demo window title bar

dies einzurichten, begann ich durch einen eigenständigen Blick auf die Fenstersteuerung Szene in meinem Storyboard hinzufügen. (Sie müssen nicht ein Storyboard verwenden, aber ich habe in diesem Projekt.)

accessory view

Meine Zubehör Ansicht ist ein NSView mit einem NSButton subview. Der Schaltflächentitel verwendet Font Awesome, um den Pin anzuzeigen.

angeschlossen ich die Zubehör Ansicht zu einem Auslass (geschickt accessoryView genannt) in meiner NSWindowController Unterklasse:

outlet connection

Dann windowDidLoad in meinem Fenster Controller, erstelle ich die NSTitlebarAccessoryViewController, legen Sie seine Eigenschaften und fügen es zum Fenster:

@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) 
} 
Verwandte Themen