2011-04-28 10 views
11

Estoy tratando de crear un NSView personalizado con ambas esquinas redondeadas y una sombra paralela. I creado una subclase NSView y tienen el siguiente drawRect: métodoNSView personalizado con esquinas redondeadas y sombra paralela

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSRect rect = NSMakeRect([self bounds].origin.x + 3, [self bounds].origin.y + 3, [self bounds].size.width - 6, [self bounds].size.height - 6); 

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:5.0 yRadius:5.0]; 
    [path addClip]; 

    NSShadow *shadow = [[[NSShadow alloc] init] autorelease]; 
    [shadow setShadowColor:[NSColor redColor]]; 
    [shadow setShadowBlurRadius:2.0f]; 
    [shadow setShadowOffset:NSMakeSize(0.f, -1.f)]; 
    [shadow set]; 

    [[NSColor controlColor] set]; 
    NSRectFill(rect); 

    [super drawRect:dirtyRect]; 
} 

El resultado es un NSView dibujado con esquinas redondeadas, pero ninguna sombra (pero hacer ver matices de color rojo alrededor de las esquinas en el anti-aliasing) . Si hago un comentario en NSBezierPath, obtendré un NSView cuadrado con una sombra. No vi nada en los documentos que sugiriera que NSShadow y NSBezierPath son mutuamente excluyentes, así que obviamente me falta algo.

¡Todas las ideas son muy apreciadas!

Respuesta

5

Parece que la sombra no respeta el trazado de recorte. ¿Intentó [path fill] en lugar de NSFillRect?

+0

Puse [ruta de relleno] en el lugar de NSFillRect() y el resultado fue el mismo –

+0

Solo en caso de que alguien lea esto [ruta de relleno] trabajó para que dibujara una esquina redondeada rect dentro drawRect –

0

Puede usar el método cornerRadius de CALayer para obtener el efecto de esquina redondeada.

+1

No estoy totalmente seguro si estoy usando CALayer correctamente, pero agregué lo siguiente a mi initWithFrame: '[self setWantsLayer: YES];' '[self setLayer: [Capa CALayer]];' 'self.layer.cornerRadius = 5.0; 'Eso no parece tener ningún efecto. –

+0

Puedes intentarlo de nuevo pero coloca '[self setWantsLayer: YES];' después de las otras dos líneas. – David

+0

Intentado intercambiar las líneas - sigue siendo el mismo resultado –

Cuestiones relacionadas