2011-03-06 11 views
5

ContentView de la ventana tiene NSTextFields. (MacOS)Cómo arreglar el resaltado del anillo de enfoque cuando se recorta cuando se usa CALayer?

estoy usando constructor de interfaces para configurar la ventana y sus características, así que nada en awakeFromNib excepto esto:

[[self.window contentView] setWantsLayer:YES]; 
CALayer *layer = [[self.window contentView] layer]; 
CGColorRef lightGray = CGColorCreateGenericGray(0.93, 1.0); 
[layer setBackgroundColor:lightGray]; 
CGColorRelease(lightGray); 

Sin embargo, el anillo de enfoque de la textField no es visible fuera de los límites de la textField .

Con capa:

Sin una capa:

Estoy pensando que este problema de pantalla es algo más grande que esto, pero no puedo encontrar un ejemplo de este problema, (y solución).

anyone?

Respuesta

4

Este es un problema conocido desde hace tiempo - hay un mention en la lista de correo Cacao-dev en 2008. El anillo de enfoque en realidad se ve arrastrado fuera del marco de su punto de vista. El dibujo NSView puede hacer esto, pero no funciona con CALayers. A pesar de una nota optimista en Leopard AppKit release notes llamada vistas, anillos de enfoque y rendimiento de dibujo, esto no ha cambiado.

En teoría, es posible moverse con los cuadros de texto de "capas" de campos de texto y agregar algo de relleno para permitir que el anillo de enfoque se muestre por completo. Sin embargo, acabo de probar esto y parece que, para NSTextField al menos, no dibujará perfectamente dentro de un marco modificado. Pruébalo, sin embargo, no lloré demasiado. (El anillo de enfoque se extiende 4 píxeles desde el cuadro en cada dirección.)

Como nota, técnicamente está rompiendo las reglas de capa de respaldo, lo que puede ser parte de por qué tiene dificultades. De NSView setWantsLayer: docs:

Al usar vistas de capa respaldados nunca se debe interactuar directamente con la capa.

Está utilizando una vista con capa de respaldo y está cambiando su fondo. Se podría evitar esto al hacer que su propia capa, pero:

Cuando se utiliza una capa de vista de alojamiento no se debe confiar en la vista de dibujo, ni debe añadir subvistas a la vista de capas de alojamiento.

que descarta colocar campos de texto en la vista.

(Consulte esta cuestión de forma, si es necesario: Difference Between Layer-Backed and Layer-Hosting Views?)

+0

gracias josh, para su respuesta más útil sobre el tema anillo de enfoque, y que también se extiende mi comprensión de la capa v respaldados por las diferencias de la capa de alojamiento.. Voy a subclase NSView para obtener el tratamiento de fondo que quiero. pensé que usar una capa era una forma adecuada de personalizar el fondo de una vista sin crear subclases. gracias por aclarar eso. – lulu

+0

Me alegro de que haya sido útil. ¡Buena suerte! –

+1

Para el registro, la cuestión del anillo de enfoque parece estar arreglada en Mavericks.(Probé con una vista de esquema en lugar de un campo de texto, pero supongo que es el mismo error). – JWWalker

Cuestiones relacionadas