2012-09-13 19 views
9

creé una aplicación Cocoa vacío en Xcode para OS X, y ha añadido:¿Cómo hacer que NSView no recorta su área de delimitación?

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    self.view = [[NSView alloc] initWithFrame:NSMakeRect(100, 100, 200, 200)]; 
    self.view.wantsLayer = YES; 
    self.view.layer = [CALayer layer]; 
    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 
    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 1, 1, 1); 

    [self.window.contentView addSubview:self.view]; 
} 

Pero el fondo de la capa girada se recorta por el área de delimitación de la vista:

enter image description here

pensé, ya que algunos versión de OS X e iOS, la vista no recortará el contenido de sus subvistas y mostrará todo dentro y fuera? En iOS, veo ese comportamiento, pero me pregunto por qué aparece así y cómo hacer que todo se muestre. (Ya estoy usando el Xcode 4.4.1 más reciente en Mountain Lion).

(nota: si se intenta el código anterior, tendrá que enlazar a cuarzo Core, y posiblemente importar la cabecera principal de cuarzo, aunque me pregunto por qué no me importo la cabecera y todavía compila perfectamente)

Respuesta

10

resulta que si la línea: se añade

((NSView *)self.window.contentView).wantsLayer = YES; 

al principio, entonces funciona como se esperaba:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    ((NSView *)self.window.contentView).wantsLayer = YES; 

    self.view = [[NSView alloc] initWithFrame:NSMakeRect(200, 200, 200, 200)]; 

    self.view.wantsLayer = YES; 

    self.view.layer.backgroundColor = [[NSColor yellowColor] CGColor]; 

    [self.window.contentView addSubview:self.view]; 
    self.view.layer.anchorPoint = CGPointMake(0.5, 0.5); 

    self.view.layer.transform = CATransform3DMakeRotation(30 * M_PI/180, 0, 0, 1); 

} 

Así que parece que si se realizan todos los puntos de vista para tener una capa de respaldo, entonces funciona igual que en iOS. (Si hay una manera rápida de hacer que todas las vistas sean respaldadas automáticamente, eso sería bueno).

la línea anchorPoint no se puede mover antes de la línea addSubview, o de lo contrario es incorrecta, aunque me pregunto por qué podría haber alguna diferencia.

La línea self.view.layer = [CALayer layer]; se puede quitar si window.contentView está respaldado por la capa. Tanto contentView como self.view no necesitan establecer la capa, y me pregunto por qué también.

La línea transform no puede estar antes de la línea addSubview, de lo contrario no girará, y me pregunto por qué también.

La tercera cosa es que, pensé que si voy a la interfaz del generador y hacer que el contentView una clase de ContentView (subclasificación de NSView), y en su método init, hacer un self.wantsLayer = YES;, entonces sería trabajar también, pero lo hace no.

Pero de todos modos, el código anterior funciona, y voy a actualizar las razones de arriba cuando sepa más.

enter image description here

+0

Soy un desarrollador de iOS y recientemente han comenzado a trabajar en el cacao. Esto me ha estado volviendo loco durante los últimos tres días. Me sorprende que no pueda encontrar más información al respecto. ¡Gracias por publicar tu solución! – KevinM

+0

Puede haber problemas al mezclar NSView con capas y capas sin capas. No es estable qué contenido se superpondrá a los demás. – Slavik

+1

La configuración 'self.wantsLayer = YES' no funciona en' init' porque 1. el inicializador correcto es 'initWithFrame:' ​​y 2. incluso esto no se llama para las vistas cargadas desde los nibs. Debería anular '-wakeFromNib' y realizar su configuración allí. Alternativamente, puede establecer la propiedad Capa de animación principal en el inspector de efectos de vista de IB. –

Cuestiones relacionadas