2010-11-29 11 views
5

¿Hay una biblioteca de código abierto para que Cocoa cree una ventana siguiendo el estilo de iTunes? Esa es la ventana de controles están dispuestos verticalmente en lugar de horizontalmente:Subclase NSWindow estilo iTunes?

sample iTunes window

Me parece que ahorra espacio y bueno para aplicaciones de tipo utilitario que no necesita un título de la ventana.

+11

me resulta molesto y en contra de directrices de diseño de Apple. Realmente desearía que no siguieran haciéndolo. Pone un mal ejemplo. – JeremyP

Respuesta

8

esto rápidamente hackeado distancia delegado NSWindow debería empezar:

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

sin embargo tengo que decir que al igual que JeremyP Sólo puedo esperar que Apple no va a difundir este más ancha en OS X.

+0

de hecho, solo espero lo mismo. esos controles son feos. –

+0

Esto funciona, pero es bastante feo. También tendrías que ampliar el tamaño de la barra de título, pero sospecho que iTunes solo está usando el equivalente de una barra NSToolbar para hacer su trabajo. Pero también necesitamos los semáforos en tamaño pequeño;) –

+0

Para igualar visualmente iTunes, obviamente tiene que usar una ventana con textura unificada. Además, si nos fijamos en cómo está configurada la interfaz de usuario de la ventana de iTunes (UI Browser), verá que ¡iTunes no usa ninguna barra de herramientas! Y esos botones de tráfico no deberían ser elementos de una barra de herramientas de todos modos, imho. Esas funciones son superordinadas de una ventana y no están relacionadas con su contenido (frente a los íconos de la barra de herramientas). (De acuerdo, el zoom está relacionado con el contenido, pero entiendes, ¿no?;)) – Regexident

1

Probablemente tendrá que subclase NSWindow, NSView y hacer la ventana y los botones dibujar usted mismo.

Ah, y solo quería agregar que se pierden algunos detalles bastante importantes al hacer un dibujo personalizado. Como el dibujo está hecho en el hilo principal y su hilo principal puede estar ocupado haciendo alguna tarea pesada que bloquee la ejecución del hilo principal durante un tiempo, el usuario no podrá mover la ventana y el mouse sobre la animación no funcionará. .

menos por supuesto que implementa ratón escuchar eventos en otro hilo, haces el dibujo allí, bloqueo de enfoque ... Lo que quería decir - no se moleste a menos que realmente piensa que esto hará que su aplicación mucho mejor :)

0

justo una versión modificada basada en @Regexident ' s para nuevos macOS. La jerarquía de vista cambió para la nueva interfaz de usuario de macOS, por lo que la versión original no funciona. El código modificado es el siguiente (funciona en 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)]; 
} 

Resultado pantalla: enter image description here