2009-11-03 10 views
11

Me gustaría personalizar la forma en que dibujo la barra de título de la ventana en OS X. Específicamente, me gustaría hacer algo como la aplicación Twitterrific donde hay un botón de cierre personalizado, sin botones min/max, y la ventana el texto del título está justificado a la derecha. A diferencia de Twitterrific, no estoy buscando personalizar la ventana completa (aunque tampoco me opongo totalmente a eso).¿Cómo dibujar a medida la barra de título de la ventana en Objective-C?

Ya he visto el ejemplo de RoundWindow en Cocoa With Love, así como el ejemplo de RoundTransparentWindow que proporciona Apple, pero ninguno parece apropiado.

Respuesta

6

Si no desea utilizar una clase de ventana sin bordes, puede hacer un par de cosas.

En primer lugar, puede personalizar los botones de cerrar/mínimo/máximo comprar usando -[NSWindow standardWindowButton:]. Una vez que el botón se puede colocar/quitarlo/etc ...

Puede personalizar el título ajustando el título a @"". Luego puede agregar un NSTextField para dibujar su propio título haciendo lo siguiente [[[NSWindow contentView] superview] addSubview:textField].

Esta es probablemente la forma más fácil de hacer las cosas.

Otra manera de hacer esto es para personalizar la vista que atrae a toda la barra de título de la ventana, etc ... de vista de contenido

de NSWindow está dentro de un "punto de vista el tema". Puede subclasificar la vista del tema y hacer su propio dibujo. El único problema es que la vista de tema es una clase privada, así que tendrás que tener cuidado.

+0

Gracias, Leibowitzn. ¿Puede proporcionar más detalles sobre cómo configurar NSTextField? ¿Cómo configuro su marco para que esté colocado correctamente en la ventana y en dónde en mi código sería el mejor lugar para hacer esto? – sam

+0

FWIW, lo hice en el método awakeFromNib del controlador de la aplicación. Posicione el marco del campo de texto en relación con el marco de la ventana. Probablemente esta no sea la mejor manera de hacerlo, pero usé notificaciones para saber cuándo la ventana se convierte en/renuncia a la ventana principal y lo usé para cambiar el color del texto. Gracias otra vez por la idea. – sam

5

cocoadev proporciona más detalles sobre la mejor manera de implementar su propia subclase NSWindow, completa con una descripción de la mayoría de las trampas comunes.

Lo esencial de esto es crear una subclase de NSWindow y establezca su styleMask a NSBorderlessWindowMask en el método 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; 
} 

Tenga en cuenta que probablemente debería volver SÍ para canbecomeKeyWindow con el fin de hacer que su comportan ventana como una ventana normal.

- (BOOL) canBecomeKeyWindow 
{ 
    return YES; 
} 

A continuación, puede crear una costumbre NSView subclase, llenar la ventana con una instancia de dicha clase, y luego realizar la totalidad de la ventana apropiada dibujo dentro de esa vista personalizada.

Todo esto puede ser un poco doloroso. Deberá volver a implementar la mayoría de los comportamientos normales de la ventana, como cambiar el tamaño arrastrando la esquina inferior derecha.

+0

Gracias, eJames. Tiene razón en que este enfoque (que había comenzado anteriormente) puede ser doloroso. Esperaba evitarlo ya que no estoy buscando una personalización completa y no quiero tener que implementar todas las funciones estándar de la ventana. Este enfoque es básicamente lo que se utiliza en la muestra a la que hice referencia en mi pregunta. Un aspecto extraño de este enfoque es que la sombra de la ventana no parece funcionar correctamente. No es tan oscuro como la sombra en una ventana estándar y no cambia cuando cambia el foco. Creo que esto podría ser un error con el estilo de ventana sin bordes. – sam

+0

El problema de sombra es extraño. Parece que la respuesta de Leibowitzn podría ser la mejor opción. ¡Suerte con ello! –

+0

El problema de sombra es un problema de larga duración. Apple no dibuja una sombra más oscura para las ventanas sin bordes que tienen el foco del teclado. Echa un vistazo a Stickies, por ejemplo. De acuerdo con Apple, la forma recomendada de evitar esto es usar un tipo de ventana normal y luego hacer todo tu propio dibujo. – Leibowitzn

2

Hay un ejemplo de una implementación de ventana personalizada en el proyecto de ejemplo Stickies de CoreData.

Cuestiones relacionadas