objective-c cocoa calayer quartz-graphics

objective c - Cómo agregar un CALayer a un NSView en Mac OS X



objective-c cocoa (3)

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

Consulte la siguiente documentación para obtener 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 vista debe ser una vista de alojamiento de capas. Debido a que es una vista de alojamiento de capas, debe interactuar con la capa, NO interactuar con la vista en sí misma y no debe agregar subvistas.

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

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

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];

Puse esto en el método - (void)drawRect:(NSRect)rect de mi subclase NSView personalizada, pero cuando ejecuto la aplicación, solo muestra una vista en blanco, sin color de fondo ni evidencia de la capa que creé.


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

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

Para hacerlo, cree un CALayer y llame al método setLayer: la vista. Luego, llame a setWantsLayer: El orden es importante, si llamarías a setWantsLayer: primero, setWantsLayer: una vista respaldada por capas.


Pon 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 dibuja la vista, se agrega y se asigna una nueva capa. También nunca he usado la línea [visualización de capa] antes. Los documentos realmente te dicen que no llames a este método directamente.