2012-03-04 24 views
6

Tengo subclases NSImageView y quiero dibujar un borde alrededor con esquinas redondeadas. Funciona, pero también necesito recortar las esquinas de la imagen.NSImageView esquinas redondeadas + carrera

Por favor, vea mi pantalla:

enter image description here

He creado este código para dibujar el borde/esquinas.

- (void)drawRect:(NSRect)dirtyRect 
{ 
    [super drawRect:dirtyRect]; 

    NSColor *strokeColor; 
    if(self.isSelected) 
     strokeColor = [NSColor colorFromHexRGB:@"f9eca2"]; 
    else 
     strokeColor = [NSColor colorFromHexRGB:@"000000"]; 

    [strokeColor set];  
    [[NSBezierPath bezierPathWithRoundedRect:NSInsetRect(dirtyRect, 1, 1) xRadius:5 yRadius:5] stroke]; 
} 

¿Qué debo hacer para hacer el clip de la imagen?

EDIT:

Bueno me fijo, pero siento que es una manera fea de hacerlo. ¿Algo más inteligente?

NUEVO CÓDIGO:

- (void)drawRect:(NSRect)dirtyRect 
{ 
    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:NSInsetRect(dirtyRect, 2, 2) xRadius:5 yRadius:5]; 

    [path setLineWidth:4.0]; 
    [path addClip]; 

    [self.image drawAtPoint: NSZeroPoint 
       fromRect:dirtyRect 
       operation:NSCompositeSourceOver 
       fraction: 1.0]; 

    [super drawRect:dirtyRect]; 

    NSColor *strokeColor; 
    if(self.isSelected) 
    { 
     strokeColor = [NSColor colorFromHexRGB:@"f9eca2"]; 
    } 
    else 
     strokeColor = [NSColor colorFromHexRGB:@"000000"]; 

    [strokeColor set];  
    [NSBezierPath setDefaultLineWidth:4.0]; 
    [[NSBezierPath bezierPathWithRoundedRect:NSInsetRect(dirtyRect, 2, 2) xRadius:5 yRadius:5] stroke]; 
} 

Respuesta

3

Establecer el radio de esquina de su NSImageView s capa también a 5 px y establecer su propiedad maskToBounds a YES.

+3

'NSImageView' no tiene una propiedad' clipsToBounds' - Es una no NS ImageView una interfaz de usuario. – SteveF

+15

¿Por qué cada segunda persona en stackoverflow asume Object-c code == iOS? – strange

+2

si lee cuidadosamente la respuesta, verá que está hablando de la capa de la vista de imagen, que tiene una propiedad clipToBounds incluso en AppKit. EDITAR: no olvide habilitar la capa con '- [NSView setWantsLayer: YES]' – dvkch

0

respuesta actualizada para XCode 8.3 y Swift 3,1

import Cocoa 

class SomeViewController: NSViewController { 
    @IBOutlet weak var artwork: NSImageView! 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    artwork.wantsLayer = true // Use a layer as backing store for this view 
    artwork.canDrawSubviewsIntoLayer = true // Important, flatten all subviews into layer 
    artwork.layer?.cornerRadius = 4.0 
    artwork.layer?.masksToBounds = true // Mask layer 
    } 
}