2012-03-04 10 views
17

Estoy tratando de aprender a usar e implementar CALayer en una aplicación Mac Objective-C, pero parece que probablemente no puedo hacer lo más básico: agregar una nueva capa y establecer su color de fondo/tamaño de fotograma. ¿Alguien puede ver lo que está mal con mi código?Cómo agregar un CALayer a un NSView en Mac OS X

CALayer *layer = [CALayer layer]; 
[layer setFrame:CGRectMake(0, 0, 100, 100)]; 
[layer setBackgroundColor:CGColorCreateGenericRGB(1.0, 0.0, 0.0, 1.0)]; 
[self.layer addSublayer:layer]; 
[layer display]; 

que poner esto en el método de mi subclase personalizada NSView- (void)drawRect:(NSRect)rect, pero cuando corro la aplicación, sólo se muestra una vista en blanco, sin color de fondo o la evidencia de la capa que he creado.

Respuesta

48

En primer lugar, no desea agregar una capa en el método drawRect: de una vista, el sistema la llama automáticamente y es probable que termine con muchas más capas de las que realmente desea. initWithFrame: o initWithCoder: (para las vistas que están en un archivo de punta) son mejores lugares para inicializar la jerarquía de su capa.

Además, NSView s no tienen una capa raíz por defecto (esto es bastante diferente de UIView en iOS). Básicamente hay dos tipos de NSView s que utilizan una capa: respaldados vistas y hosting de capas vistas. Si desea interactuar directamente con la capa (agregar subcapas, etc.), debe crear una capa que aloje la vista.

Para hacer eso, crea un CALayer y llama al método setLayer: de la vista. Luego, llame al setWantsLayer:. El orden es importante, si primero llama al setWantsLayer:, realmente crearía una vista con respaldo de capa.

+0

gracias por esta útil respuesta, estaba pensando que tal vez no había una capa básica adjunta al nsview –

1

Ponga esto fuera del drawRect. Normalmente pongo mi configuración de capa en el método init o en viewDidLoad.

De lo contrario, cada vez que se dibuje la vista, se agregará y asignará una nueva capa. Además, nunca antes había usado la línea [mostrar capa]. Los documentos realmente te dicen que no llames a este método directamente.

+0

Gracias por responder, pero esto no cambió nada. La vista todavía está en blanco. Por cierto, estoy tratando de crear una aplicación mac os x, así que no puedo llamar a viewDidLoad. – GravityScore

+0

Oh, lo siento, me lo perdí. Debe haber algún método de inicialización que se produce cuando se carga la ventana. No estoy familiarizado con la programación de Mac, pero sé iOS-wise que QuartzCore necesita ser importado para que CALayer sea aplicable (no quiero suponer que sabes esto). Lo que también podrías intentar es manipular la capa raíz directamente para ver si está funcionando ([self.layer setBackgroundColor: ...]). – atreat

4

Debe realizar una llamada al método "setWantsLayer".

Mira la siguiente documentación para la descripción de setWantsLayer: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

En pocas palabras, su punto de vista tiene que ser vista de capas de alojamiento. Debido a que es una vista de alojamiento de capa, debe interactuar con la capa y NO interactuar con la vista en sí y no agregarle subvistas.

[self setLayer:[CALayer new]]; 
[self setWantsLayer:YES];  // the order of setLayer and setWantsLayer is crucial! 
[self.layer setBackgroundColor:[backgroundColor CGColor]]; 
Cuestiones relacionadas