2012-05-09 13 views
6

estoy tratando de dibujar una sombra en forma personalizada utilizando CALayer:Error en el shadowPath de CALayer?

#import <QuartzCore/QuartzCore.h> 

@implementation ZKSBAppDelegate 

@synthesize window = _window; 

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

    CALayer *shadowLayer = [CALayer layer]; 
    shadowLayer.shadowOpacity = 1; 
    shadowLayer.shadowRadius = 1; 
    shadowLayer.shadowOffset = NSMakeSize(0, 0); 

    CGMutablePathRef shadowPath = CGPathCreateMutable(); 
    // setting the following rect's width to 100 fixes everything. 
    // setting it to 130 screws the shadow even more. 
    CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 120, 48)); 
    CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 
    shadowLayer.shadowPath = shadowPath; 
    CGPathRelease(shadowPath); 

    [view.layer addSublayer:shadowLayer]; 
} 
@end 

Se puede crear un proyecto vacío de cacao en Xcode, reemplace el contenido del archivo .m de su app.delegate con el código anterior y hacerlo por uno mismo .

Parece que la geometría de la sombra específica provoca CALayer a volver loco.

Por ejemplo:

CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 100, 48)); 
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 

Este se ve perfectamente bien:

Okay case

Ahora voy a hacer el primero rectángulo más ancho por 20 puntos:

CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 120, 48)); 
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 

Whoa case

... no se ve tan bueno ya. Más 10 puntos:

CGPathAddRect(shadowPath, NULL, CGRectMake(4, 0, 130, 48)); 
CGPathAddRect(shadowPath, NULL, CGRectMake(120, 50, 116, 48)); 

WTF case

Ahora que es un error normal, ¿no?

Entonces, la pregunta es: ¿qué diablos está pasando, lo estoy haciendo mal o algo? ¿Crees que es un error y debo presentar un informe?

Respuesta

3

Sí, eso suena como a un insecto. Incluso si no lo es, al presentar un informe de error, Apple debe responder y brindarle información útil.

+0

Sí, definitivamente ** ** presentar un informe. Es muy probable que los ingenieros de Apple no descubran este tipo de cosas a menos que les informemos. –

+0

@ DavidRönnqvist podría haber sido un error de mi parte, no quería provocar una falsa alarma. – zrxq

+0

Cinco meses después: nada. – zrxq