2009-11-03 13 views
11

Chciałbym dostosować sposób rysowania paska tytułu okna na OS X. W szczególności chciałbym zrobić coś takiego, jak aplikacja Twitterrific, gdzie jest niestandardowy przycisk zamykania, brak przycisków min/max i okna tekst tytułu jest wyrównany do prawej. W przeciwieństwie do Twitterrific nie szukam niestandardowego narysowania całego okna (chociaż nie jestem do tego całkowicie przeciwny).Jak niestandardowy pasek tytułu okna rysowania w Objective-C?

Widziałem już próbkę RoundWindow na Cocoa With Love oraz przykład RoundTransparentWindow, który zapewnia Apple, ale żadna z nich nie wydaje się odpowiednia.

Odpowiedz

6

Jeśli nie chcesz używać klasy okna bez obramowania, możesz zrobić kilka rzeczy.

Po pierwsze, możesz dostosować przyciski close/min/max, kupując przy użyciu -[NSWindow standardWindowButton:]. Po uzyskaniu przycisku możesz go ustawić/usunąć// ...

Możesz dostosować tytuł, ustawiając tytuł na @"". Następnie możesz dodać NSTextField, aby narysować własny tytuł, wykonując następujące [[[NSWindow contentView] superview] addSubview:textField].

Jest to prawdopodobnie najprostszy sposób robienia rzeczy.

Innym sposobem, aby to zrobić, aby dostosować widok, który czerpie cały pasek tytułu okna, itp ...

NSWindow za treść widok jest wewnątrz „tematyczne”. Możesz podklasować widok motywu i zrobić własny rysunek. Jedynym problemem jest to, że widok motywu jest prywatną klasą, więc musisz być ostrożny.

+0

Dziękuję, Leibowitzn. Czy możesz podać więcej szczegółów na temat konfiguracji NSTextField? Jak ustawić ramkę tak, aby była prawidłowo umieszczona w oknie i gdzie w moim kodzie byłoby to najlepsze miejsce? – sam

+0

FWIW, zrobiłem to w metodzie awakeFromNib kontrolera aplikacji. Ustawiłem ramkę pola tekstowego względem ramki okna. Prawdopodobnie nie jest to najlepszy sposób, ale użyłem powiadomień, aby wiedzieć, kiedy okno staje się/rezygnuje z głównego okna i użyć go do zmiany koloru tekstu. Jeszcze raz dziękuję za pomysł. – sam

5

dostarcza więcej szczegółów na temat najlepszego wdrożenia własnej podklasy NSWindow, wraz z opisem większości typowych pułapek.

Istotą jest to, aby utworzyć podklasę NSWindow i ustawić jego styleMask do NSBorderlessWindowMask w metodzie Init:

- (id) initWithContentRect: (NSRect) contentRect 
       styleMask: (unsigned int) aStyle 
        backing: (NSBackingStoreType) bufferingType 
        defer: (BOOL) flag 
{ 
    if ((self = [super initWithContentRect: contentRect 
           styleMask: NSBorderlessWindowMask 
            backing: bufferingType 
            defer: flag]) == nil) { return nil; } 

    [super setMovableByWindowBackground:YES]; 
    [super setLevel:NSNormalWindowLevel]; 
    [super setHasShadow:YES]; 
    // etc. 

    return self; 
} 

Zauważ, że powinieneś wrócić TAK dla canbecomeKeyWindow aby dokonać okno zachowywać jak normalne okno.

- (BOOL) canBecomeKeyWindow 
{ 
    return YES; 
} 

Następnie można utworzyć niestandardową NSView podklasę, wypełnić całe okno z instancją wspomnianej klasy, a następnie wykonać wszystkie odpowiednim oknie rysunku z poziomu tego widoku niestandardowego.

Cała sprawa może być trochę bolesna. Będziesz musiał ponownie wdrożyć większość normalnych zachowań okna, takich jak zmiana rozmiaru, przeciągając dolny prawy róg.

+0

Dzięki, eJames. Masz rację, że to podejście (które zacząłem wcześniej) może być bolesne. Miałem nadzieję, że tego uniknę, ponieważ nie szukam pełnej personalizacji i nie chcę implementować wszystkich standardowych funkcji okna. To podejście jest zasadniczo tym, co jest używane w próbce, której dotyczyłem w moim pytaniu. Jednym dziwnym aspektem tego podejścia jest to, że cień okna nie działa poprawnie. Nie jest tak ciemny jak cień w standardowym oknie i nie zmienia się, gdy zmienia się ostrość. Myślę, że może to być błąd w stylu okna bez obramowania. – sam

+0

Problem z cieniem jest dziwny. Wygląda na to, że odpowiedź Leibowitzn może być dla ciebie odpowiednia. Powodzenia z tym! –

+0

Problem z cieniem to długotrwały problem. Apple nie rysuje ciemniejszego cienia dla okien bez obramowania, które mają ognisko klawiatury. Spójrz na przykład na Stickies. Według Apple zalecanym sposobem obejścia tego problemu jest użycie zwykłego typu okna, a następnie wykonanie całego własnego rysunku. – Leibowitzn

2

Istnieje przykład niestandardowej implementacji okna w projekcie przykładowym CoreData Stickies.

Powiązane problemy