2012-06-09 20 views
5

Así que soy bastante nuevo en AppKit y Cocoa (viniendo de UIKit con CocoaTouch) y actualmente estoy implementando una interfaz para doblar una NSWindow. En iOS esto sería bastante fácil, pero viendo cómo hay muchas pequeñas diferencias con OS X, elijo preguntar."Plegar" una NSWindow usando CoreAnimation

¿Cómo implementaría la siguiente transición?

Window Fold

Nota: La barra inferior es parte de mi contentView y no a la barra inferior OS X proporciona. Es decir. mi ventana (INAppStoreWindow por cierto) consiste en un titleBar y un contentView.

Supongo que podría simplemente doblar la vista de contenido y cambiar el tamaño de la ventana de forma sincrónica, pero sería preferible si pudiera conservar la transparencia durante el plegado, lo que sucede debido a la transformación de perspectiva. Es decir. los lados que están doblados hacia adentro deben ser (durante la transición) transparentes. ¿O estoy pensando demasiado?

Respuesta

2

Malas noticias primero: a diferencia de UIKit, AppKit no utiliza Core Animation para representar sus controles. Todos los CALayers habitan su propio mundo dentro de las instancias especiales de alojamiento de capas de NSView. Entonces, a menos que la vista de contenido de su ventana sea alojamiento de capa, no puede aplicar una CAAnimations a los contenidos de su ventana como un todo sin un grado de piratería (podría ser posible renderizar toda la vista de contenido a un mapa de bits, establecer eso como el contenido de una capa, y realizar la transformación sobre eso. No estoy seguro).

Afortunadamente, su vista de contenido está basada en Core Animation. De ser así, el enfoque que describes debería funcionar. También debería ser capaz de alojar la capa en una ventana transparente NSWindow sin bordes y, a continuación, las transformaciones que realice en la vista de contenido revelarán el escritorio detrás de ella. He aquí un fragmento (de Matt Long) que debe hacer lo que quiere:

- (id) initWithContentRect: (NSRect) contentRect 
       styleMask: (unsigned int) aStyle 
        backing: (NSBackingStoreType) bufferingType 
        defer: (BOOL) flag 
{ 
    if (![super initWithContentRect: contentRect 
          styleMask: NSBorderlessWindowMask 
          backing: bufferingType 
         defer: flag]) return nil; 
    [self setBackgroundColor: [NSColor clearColor]]; 
    [self setOpaque:NO]; 

    return self; 
} 
+0

mi punto de vista contenido se basa Sí CoreAnimation, y soy consciente de que escollo. El problema con NSBorderlessWindowMask es que si configuro el color de fondo para clearColor, el sistema dibuja una sombra de ventana. Claro que podría seguir adelante y hacer el mío, pero eso sería básicamente como dibujar mi propia ventana por completo. Me gustaría evitar eso debido al posible cambio de la interfaz en versiones posteriores de OS X. – pkluz

+0

Su problema con la sombra de la ventana es prácticamente el mismo que el de los controles estándar. AppKit no se procesa mediante animación central, por lo que cualquier elemento que reproduzca no podrá usar animación principal. Tienes que vivir sin él o volver a implementarlo tú mismo. Apesta, lo sé. Supongo que es solo parte del equipaje que viene con el trabajo en una aplicación anterior ... –

Cuestiones relacionadas