2010-11-29 34 views
5

Y at-il une bibliothèque open-source pour Cocoa pour créer une fenêtre suivant le style d'iTunes? C'est la fenêtre de contrôle sont disposées verticalement au lieu de horizontalement:Sous-classe NSWindow de style iTunes?

sample iTunes window

Je trouve peu encombrant et bon pour les applications de type utilitaire qui n'a pas besoin d'un titre de la fenêtre.

+11

Je trouve ennuyeux et contre Apple Design Guidelines. Je souhaite vraiment qu'ils ne continueraient pas à le faire. Cela donne un mauvais exemple. – JeremyP

Répondre

8

ce rapidement piraté loin délégué NSWindow devrait vous aider à démarrer:

//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 

Cependant, je dois dire que tout comme JeremyP je ne peux qu'espérer que Apple ne va pas diffuser ce tout plus large dans OS X.

+0

en effet, j'espère juste la même chose. ces contrôles sont laids. –

+0

Cela fonctionne, mais est assez moche. Vous devrez également étendre la taille de la barre de titre, mais je soupçonne qu'iTunes n'utilise que l'équivalent Cocoa d'une barre NSToolbar pour faire son travail. Mais alors nous avons aussi besoin des feux de circulation de petite taille;) –

+0

Pour visuellement correspondre à iTunes, vous devez évidemment utiliser une fenêtre texturée unifiée. De plus, si vous regardez comment l'interface utilisateur de la fenêtre d'iTunes est configurée (Navigateur UI), vous verrez qu'iTunes n'utilise aucune barre d'outils! Et ces boutons de trafic ne devraient pas être des éléments d'une barre d'outils de toute façon, à mon humble avis. Ce sont des fonctions supérieures d'une fenêtre et ne sont pas liées à son contenu (par rapport aux icônes de la barre d'outils). (Ok, le zoom est un peu lié au contenu, mais vous avez compris, n'est-ce pas?;)) – Regexident

1

Vous devrez probablement sous-classer NSWindow, NSView et faire vous-même la fenêtre et les boutons.

Oh et je voulais juste ajouter que vous perdez quelques détails assez importants en faisant un dessin personnalisé. Puisque le dessin est fait dans le thread principal et que votre thread principal pourrait être occupé à faire une tâche lourde et importante bloquant l'exécution du thread principal pendant un moment, l'utilisateur ne pourra pas déplacer la fenêtre et le bouton de la souris sur l'animation ne fonctionnera pas .

À moins bien sûr que vous implémenter des événements en écoutant la souris dans un autre thread, faire le dessin là, Mémorisation ... Ce que je voulais dire - ne pensez embêtez pas à moins que vous vraiment cela rendra votre application beaucoup mieux :)

0

juste une version modifiée basée sur @Regexident ' s pour les nouveaux macOS. La hiérarchie de vue a changé pour la nouvelle interface utilisateur macOS, de sorte que la version d'origine ne fonctionne pas. Le code modifié est la suivante (fonctionne sous Mac OS 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)]; 
} 

capture d'écran de résultats: enter image description here