2012-03-04 16 views
6

Mam podklas NSImageView i chcę narysować obramowanie z zaokrąglonymi narożnikami. Działa, ale muszę również spiąć narożniki obrazu.NSImageView zaokrąglone rogi + skok

Proszę zobaczyć mój zrzut ekranu:

enter image description here

stworzyłem ten kod wyciągnąć granicy/narożniki.

- (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]; 
} 

Co należy zrobić, aby klip wideo?

EDIT:

Dobrze Naprawiłem to, ale czuję Jego brzydki sposób to zrobić. Coś mądrzejszego?

NOWY KOD:

- (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]; 
} 

Odpowiedz

3

Ustaw promień rogu NSImageView s warstwy również do 5 px i ustawić jego właściwość YESmaskToBounds.

+3

'NSImageView' nie posiada' własność clipsToBounds' - To nie NS ImageView UI. – SteveF

+15

Dlaczego co druga osoba na stackoverflow zakłada obiektywny kod c == iOS? – strange

+2

, jeśli przeczytałeś uważnie odpowiedź, którą zobaczysz, mówi o warstwie widoku obrazu, która ma właściwość clipToBounds nawet w AppKit. EDYCJA: nie zapomnij włączyć warstwy przy użyciu '- [NSView setWantsLayer: YES]' – dvkch

0

zaktualizowane odpowiedź na XCode 8.3, 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 
    } 
} 
Powiązane problemy