2012-03-31 15 views
7

Przez ostatnie kilka dni męczyłem się nad tym, jak zrobić coś, co wydaje się całkiem proste. Szukałem, ale nie mogę znaleźć niczego.Dodaj przycisk do paska tytułu okna

Chcę móc dodać przycisk do wszystkich okien, które otwierają się na komputerze Mac (przejdzie on po prawej stronie, naprzeciwko przycisków "X" "-" "+"). Wierzę, że obszar, do którego chcę dodać przycisk, nazywa się tytułem, chociaż nie jestem tego pewien.

Nie mogę znaleźć sposobu, aby to zrobić w konstruktorze interfejsów. Ale nawet gdybym to zrobił, chciałbym, aby przycisk pojawiał się we wszystkich oknach otwieranych na Macu (oczywiście po zainstalowaniu tego programu przez użytkownika).

Rozumiem, że jest to zasadniczo "podłączenie" do interfejsu użytkownika systemu operacyjnego, ale widziałem, że inne aplikacje to robią, co sprawia, że ​​czuję, że jest to możliwe.

Poszukuję jakichś wskazówek na ten temat, gdzie mogę je przeczytać, fragmenty kodu i po prostu ogólną radę, wezmę wszystko.

Oto zrzut ekranu, gdzie chcę przycisk:

Screenshot

+0

Wystarczy być ostrożnym, gdzie można dodać it- użytkownikom systemu Mac OS X 10.7 i aż będzie miał przycisk „Pełny ekran” na prawej stronie. Upewnij się, że przycisk jest nieco przesunięty w lewo. –

+0

Przydatne powiązane pytanie: http: // stackoverflow.com/questions/3833241/add-secondary-text-to-window-title-bar-in-cocoa –

Odpowiedz

6

To jest naprawdę dwuczęściowe pytanie. Jeśli chodzi o sposób, aby dostać się tam przycisk, sugeruję, aby uzyskać stosując -[NSWindow standardWindowButton:] istniejący przycisk okna i jego Superview (czyli pasku tytułowym):

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. 

zatykanie-in jest prawdopodobnie najłatwiejsze do zrobienia jako SIMBL wtyczka.

+0

Czy to działa na wszystkich zainstalowanych programach? – JoePasq

+0

Z tego, co wiem, użycie NSWindowCloseButton i podobnych jest używane do decydowania, czy wyświetlić standardowe przyciski. Interfejs API nie jest tutaj bardzo pomocny, nie mówi mi, co zwróci metoda lub cokolwiek. Chodzi mi o to, że nie jestem pewien, w jaki sposób użyłbym standardowego przyciskuWindowButton:] do umieszczenia własnych przycisków, wydaje się, że jest to edycja istniejących. – Timsk

+0

Interfejs API zwraca wymagane przyciski. Możesz go użyć, aby je ukryć, ale nie musisz. W tym przykładzie istniejący przycisk okna służy do znalezienia widoku, który otacza standardowe przyciski okna (to znaczy widok paska tytułu). Rozszerzyłem mój przykład i dodałem komentarze. Nie jestem do końca pewien, co masz na myśli mówiąc "nie mówi mi, co ta metoda by zwróciła, ani nic". Odwołanie do klasy NSWindow [oczywiście robi to] (http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference.html#//apple_ref/occ/instm/ NSWindow/standardWindowButton :). – gcbrueckmann

7

Oficjalnie obsługiwany sposób dodawania przycisku paska tytułu w systemie OS X 10.10 (Yosemite) i nowszych polega na utworzeniu NSTitlebarAccessoryViewController i dodaniu go do okna za pomocą -[NSWindow addTitlebarAccessoryViewController].

Na przykład, mam okno, które ma tytuł widoku bar akcesorium:

demo window title bar

Aby to skonfigurować, zacząłem przez dodanie osobnego widoku do okna kontrolera sceny w moim ujęć. (Nie trzeba używać storyboard, ale ja w tym projekcie.)

accessory view

Mój pogląd akcesorium jest NSView z NSButton podrzędny. Tytuł przycisku używa czcionki Awesome do wyświetlania pinezki.

podłączyłem akcesoriów widok do gniazdka (sprytnie nazwane accessoryView) w moim NSWindowController podklasy:

outlet connection

Następnie w moim oknem regulatora windowDidLoad, tworzę z NSTitlebarAccessoryViewController ustaw jego właściwości i dodać go do okna:

@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) 
} 
Powiązane problemy