2011-02-23 15 views
12

Estoy creando una subclase NSView que tiene esquinas redondeadas. Esta vista está destinada a ser un contenedor y se le agregarán otras subvistas. Estoy tratando de obtener las esquinas redondeadas del NSView para recortar todas las esquinas de la subvista, pero no puedo obtenerla.Rectángulo redondeado en NSView que recorta todas las subvistas que contienen

- (void)drawRect:(NSRect)dirtyRect { 
    NSRect rect = [self bounds]; 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:rect xRadius:self.radius yRadius:self.radius]; 
    [path addClip]; 

    [[NSColor redColor] set]; 
    NSRectFill(dirtyRect); 

    [super drawRect:dirtyRect];  
} 

El rojo es solo por ejemplo. Si agrego una subvista al rect, Las esquinas no están recortadas: enter image description here

¿Cómo puedo lograr esto?

+1

El clip en -drawRect: afectan * solo * el dibujo de la vista y no tiene nada que ver con las subvistas que aún existen en el rectángulo completo de la vista. El dibujo no está * sobre * las subvistas, está * bajo * ellas. La respuesta de Jason i s sobre la única manera de lograr esto. Use vistas respaldadas por capa. –

Respuesta

-1

¿Has probado el recorte con capas?

self.layer.cornerRadius = self.radius; self.layer.masksToBounds = YES;


Ah, lo siento, de alguna manera me he echado de menos que hablabas de NSView, no UIView. Sería difícil recortar las subvistas de NSView en todos los casos porque parece que la mayoría de las vistas estándar de Cocoa establecen su propio trazado de recorte. Puede ser más fácil diseñar subvistas con algunos rellenos y evitar la necesidad de recorte.

+0

Sí. Agregar estas líneas, así como también [self setWantsLayer: YES], no redondea las esquinas del contenedor o sus contenidos – coneybeare

+0

Ah, lo siento, de alguna manera he echado de menos que hablabas de NSView, no de UIView. Sería difícil recortar las subvistas de NSView en todos los casos porque parece que la mayoría de las vistas estándar de Cocoa establecen su propio trazado de recorte. Puede ser más fácil diseñar subvistas con algunos rellenos y evitar la necesidad de recorte. – tundrabot

+0

Repensé mi diseño. Marcado correcto para eso, pero debes editar tu respuesta para incluir lo que dijiste en el comentario, no las capas incorrectas para evitar confusiones. – coneybeare

26

El uso de las capas de Animación central recortará las subcapas correctamente.

En su contenedor NSView subclase:

- (id)initWithFrame:(NSRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     self.layer = _layer; // strangely necessary 
     self.wantsLayer = YES; 
     self.layer.masksToBounds = YES;  
     self.layer.cornerRadius = 10.0;  
    }  
    return self; 
} 
+2

Nota: Esto no funcionará para el caso especial de redondear las esquinas de un NSScrollView cuya vista de documento crece en tamaño más allá de los límites de NSScrollView (parece restablecer la ruta de recorte de capa una vez que los límites del documento cambian). Sin embargo, funcionará si la vista del documento es un tamaño estático inferior o igual al tamaño de la vista de desplazamiento. – Dalmazio

+2

Antes de llamar a self.wantsLayer = YES; necesitas configurar la capa: self.layer = layer; http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html#//apple_ref/doc/uid/20000014-SW61 –

+1

@JasonFuerstenberg 'self. wantsLayer = YES; 'creará automáticamente un' CALayer' y lo asignará a la propiedad 'layers' de views. Realmente no hay razón para hacer esto. – NSAddict

10

usted puede hacerlo en el constructor de interfaces sin la subclasificación añadir tiempo de ejecución definido por el usuario Atributos"

enter image description here

+0

Tenga en cuenta que esto solo funciona si _no activa el CALayer en el inspector de efectos de vista; su configuración parece anular los atributos personalizados. – ThatsJustCheesy

Cuestiones relacionadas