2010-11-29 9 views
5

Gibt es eine Open-Source-Bibliothek für Cocoa, um ein Fenster nach dem Stil von iTunes zu erstellen? Das ist die Fensterheber ausgelegt sind vertikal statt horizontal:iTunes-Stil NSWindow-Unterklasse?

sample iTunes window

Ich finde es platzsparend und gut für Utility-Typ-Anwendungen, die kein Fenster Titel benötigt.

+11

ich es ärgerlich und gegen Apple-Design-Richtlinien finden. Ich wünschte wirklich, sie würden es nicht weiter machen. Es ist ein schlechtes Beispiel. – JeremyP

Antwort

8

Diese schnell gehackt weg sollte NSWindow Delegat Ihnen den Einstieg:

//VerticalTrafficLightsWindowDelegate.h 

#import <Cocoa/Cocoa.h> 

@interface VerticalTrafficLightsWindowDelegate : NSObject <NSWindowDelegate> { 
    NSWindow *window; 
} 

@property (assign) IBOutlet NSWindow *window; 

- (void)verticalizeButtonsForWindow:(NSWindow *)aWindow; 

@end 

//VerticalTrafficLightsWindowDelegate.m 

#import "VerticalTrafficLightsWindowDelegate.h" 

@implementation VerticalTrafficLightsWindowDelegate 

@synthesize window; 

- (void)awakeFromNib { 
    [self verticalizeButtonsForWindow:window]; 
} 

- (void)windowDidResize:(NSNotification *)notification { 
    [self verticalizeButtonsForWindow:window]; 
} 

- (void)verticalizeButtonsForWindow:(NSWindow *)aWindow { 
    NSArray *contentSuperViews = [[[aWindow contentView] superview] subviews]; 

    NSView *closeButton = [contentSuperViews objectAtIndex:0]; 
    NSRect closeButtonFrame = [closeButton frame]; 

    NSView *minimizeButton = [contentSuperViews objectAtIndex:2]; 
    NSRect minimizeButtonFrame = [minimizeButton frame]; 

    NSView *zoomButton = [contentSuperViews objectAtIndex:1]; 
    NSRect zoomButtonFrame = [zoomButton frame]; 

    [minimizeButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y - 20.0, minimizeButtonFrame.size.width, minimizeButtonFrame.size.height)]; 
    [zoomButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y - 40.0, zoomButtonFrame.size.width, zoomButtonFrame.size.height)]; 
} 

@end 

jedoch, dass ich muss sagen, wie JeremyP ich nur hoffen kann, von Apple geht auf diese jede breiter in OS X.

+0

in der Tat, ich hoffe nur das Gleiche. diese Kontrollen sind hässlich. –

+0

Das funktioniert, ist aber ziemlich hässlich. Sie müssten auch die Größe der Titelleiste erweitern, aber ich vermute, dass iTunes nur das Cocoa-Äquivalent einer NSToolbar verwendet, um seine Arbeit zu erledigen. Aber dann brauchen wir auch die Ampeln in kleiner Größe;) –

+0

Um optisch an iTunes zu kommen, muss man natürlich ein einheitliches strukturiertes Fenster verwenden. Wenn Sie sich außerdem ansehen, wie die Benutzeroberfläche von iTunes eingerichtet ist (UI-Browser), sehen Sie, dass iTunes überhaupt keine Symbolleiste verwendet! Und diese Traffic-Buttons sollten sowieso keine Elemente einer Toolbar sein, imho. Diese sind übergeordnete Funktionen eines Fensters und stehen nicht in Beziehung zu ihrem Inhalt (gegenüber Symbolleistensymbolen). (Okay, der Zoom ist irgendwie contentbezogen, aber Sie verstehen was, oder?)) – Regexident

1

Sie müssen wahrscheinlich NSWindow, NSView Unterklasse und das Fenster und die Tasten selbst zeichnen.

Oh und wollte nur hinzufügen, dass Sie einige wichtige Details verlieren, die benutzerdefinierte Zeichnung tun. Da die Zeichnung im Hauptthread erstellt wird und Ihr Hauptthread mit einer wichtigen Aufgabe, die die Ausführung des Hauptthreads für einige Zeit blockiert, beschäftigt ist, kann der Benutzer das Fenster nicht verschieben und die Maus über der Animation funktioniert nicht .

Es sei denn, Sie implementieren Maus hören Ereignisse in einem anderen Thread, die Zeichnung dort tun, Fokus zu sperren ... Was ich meinte war - nicht die Mühe, es sei denn, Sie glauben wirklich, dass dies Ihre App viel besser macht :)

0

einfach nicht verbreitet eine modifizierte Version basierend auf @Regexident ' s für neues macOS. Die Ansichtshierarchie wurde für die neue macOS-Benutzeroberfläche geändert, sodass die ursprüngliche Version nicht funktioniert. Der modifizierte Code ist wie folgt (funktioniert auf macOS 10.13):

- (void)verticalizeButtonsForWindow:(NSWindow *)aWindow { 
    // New view hierarchy. 
    NSView *titleBarContainerView = aWindow.contentView.superview.subviews[1]; 
    titleBarContainerView.frame = NSMakeRect(titleBarContainerView.frame.origin.x, titleBarContainerView.frame.origin.y - 60.0 + titleBarContainerView.frame.size.height, titleBarContainerView.frame.size.width, 60.0); 
    NSView *titleBarView = titleBarContainerView.subviews[0]; 
    titleBarView.frame = NSMakeRect(0.0, 0.0, titleBarView.frame.size.width, 60.0); 
    NSArray *titleBarSubviews = titleBarView.subviews; 

    NSView *closeButton = [titleBarSubviews objectAtIndex:0]; 
    NSRect closeButtonFrame = [closeButton frame]; 

    NSView *minimizeButton = [titleBarSubviews objectAtIndex:2]; 
    NSRect minimizeButtonFrame = [minimizeButton frame]; 

    NSView *zoomButton = [titleBarSubviews objectAtIndex:1]; 
    NSRect zoomButtonFrame = [zoomButton frame]; 

    // Coordinate changed: add instead of minus. 
    [minimizeButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y + 20.0, minimizeButtonFrame.size.width, minimizeButtonFrame.size.height)]; 
    [zoomButton setFrame:NSMakeRect(closeButtonFrame.origin.x, closeButtonFrame.origin.y + 40.0, zoomButtonFrame.size.width, zoomButtonFrame.size.height)]; 
} 

Ergebnis Screenshot: enter image description here