Frage

Ich habe einen NSMatrix mit ein paar NSButtons, die keinen Text haben, aber nur Bilder sind. Eines der Bilder wird aus dem Internet heruntergeladen und ich möchte es in meiner OS X -Anwendung abgerundete Ecken haben.

Ich fand eine Antwort, die fast das ist, wonach ich gesucht habe: Wie man einen abgerundeten NSIMage zeichnet Aber leider handelt es verrückt, wenn ich es benutze:

// In my NSButtonCell subclass
- (void)drawImage:(NSImage*)image withFrame:(NSRect)imageFrame inView:(NSView*)controlView
{
    // [super drawImage:image withFrame:imageFrame inView:controlView];

    [NSGraphicsContext saveGraphicsState];

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:imageFrame xRadius:5 yRadius:5];
    [path addClip];

    [image drawInRect:imageFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];

    [NSGraphicsContext restoreGraphicsState];
}

Das Problem ist, dass wenn ein Bild teilweise transparent ist (PNG), es vollständig zerstört wird und ich nur ein paar weiße Pixel auf einem schwarzen Hintergrund sehe.

Und wenn das Bild nicht transparent ist, wird die abgerundeten Ecken, aber 180 ° gedreht, und ich weiß nicht warum.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Sie müssen sicherstellen NSImage Methode drawInRect:fromRect:operation:fraction:respectFlipped:hints: Um sicherzustellen, dass das Bild den richtigen Weg nach oben gezogen wird:

- (void)drawImage:(NSImage*)image withFrame:(NSRect)imageFrame inView:(NSView*)controlView
{
    // [super drawImage:image withFrame:imageFrame inView:controlView];

    [NSGraphicsContext saveGraphicsState];

    NSBezierPath *path = [NSBezierPath bezierPathWithRoundedRect:imageFrame xRadius:5 yRadius:5];
    [path addClip];

    //set the size
    [image setSize:imageFrame.size];

    //draw the image
    [image drawInRect:imageFrame fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0 respectFlipped:YES hints:nil];

    [NSGraphicsContext restoreGraphicsState];
}

Das Bild sollte richtig zeichnen, wenn Sie dies tun, auch wenn es sich um ein durchscheinendes PNG -Bild handelt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top