2010-06-23 11 views
5

Ich versuche, die Form einer Reflexion mit Cocoa zu zeichnen. Ich habe bereits eine NSAffineTransform angewendet und die Form erfolgreich neu gezeichnet, aber jetzt kann ich nicht herausfinden, wie man eine Alpha-Maske darüber zeichnet. Ich verwende eine NSCompositeDestinationOut Operation, aber es gibt mir ein unerwünschtes Ergebnis: alt text http://img687.imageshack.us/img687/2417/capturedcran20100623094.pngCocoa: Mit einem NSGradient als Maske zum Zeichnen darunter

Ich bin mir nicht ganz sicher, wie dies zu beheben - ich muß es machen so der Gradient wirkt nur als Alpha-Maske und ist nicht tatsächlich angezeigt. Verwende ich den falschen Compositing-Modus?

Danke! Hier ist der Gradient-Code, falls benötigt:

- (void)fadeOutRect:(NSRect)rect { 
    [NSGraphicsContext saveGraphicsState]; 
    [[NSGraphicsContext currentContext] setCompositingOperation:NSCompositeDestinationOut]; 

    NSGradient *gradient = [[NSGradient alloc] initWithColorsAndLocations: 
          [[NSColor blackColor] colorWithAlphaComponent:0.5], 0.0, 
          [[NSColor blackColor] colorWithAlphaComponent:1.0], 0.8, nil]; 
    [gradient drawInRect:NSMakeRect(rect.origin.x, rect.origin.y + rect.size.height - (PILL_HEIGHT * 2), 
            rect.size.width, PILL_HEIGHT) angle:270]; 

    [NSGraphicsContext restoreGraphicsState]; 
} 
+0

Sie benötigen ein Maskenbild erstellen, zusammengesetzt, dass mit Ihrer Quellbild, dann ziehen das resultierende Bild. http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingquarz2d/dq_images/dq_images.html – hooleyhoop

+0

Aber das Objekt, das ich maskiere, ist kein Bild, es ist ein dynamisch gezeichnetes Steuerelement. Kann ich es irgendwie schaffen, ein Bild zu zeichnen und es zu benutzen? –

Antwort

2

Ja. Hier ist ein Beispiel für den Code, den wir verwenden, um dies zu tun. Es verwendet ein Quellbild und hat ein bisschen Spaß mit einem Skalierungsfaktor, aber Sie sollten in der Lage sein, die grundlegenden Struktur- und Compositing-Optionen zu verwenden, um das zu tun, was Sie brauchen. (Dieser Code ist in dem [reflectionImage lockFocus] Block, und selbst ist die NSImage, dass wir die Reflexion machen.)

// Draw our mask into the image 
NSGradient* fade = [[NSGradient alloc] initWithStartingColor:[NSColor colorWithCalibratedWhite:1.0 alpha:0.5] 
               endingColor:[NSColor clearColor]]; 
[fade drawFromPoint:NSMakePoint(0.0, size.height) 
      toPoint:NSMakePoint(0.0, 0.0) 
      options:0]; 

// Composite the original image, upside-down 
NSAffineTransform* flipper = [NSAffineTransform transform]; 
[flipper scaleXBy:1.0 yBy:-1.0]; 
[flipper concat]; 
[self drawInRect:NSMakeRect(0.0, -1.0*size.height, size.width, size.height) 
     fromRect:NSMakeRect(0.0, 0.0, self.size.width, size.height/scaleFactor) 
     operation:NSCompositeSourceIn fraction:1.0]; 
+0

Okay, ich zeichne jetzt die Form in ein NSMage und fasse es mit der von dir gezeigten Methode zusammen, aber alles, was angezeigt wird, ist eine Blackbox. –

+0

Sie müssen genauer sein - wie in Ihrem Code - über was genau Sie tun. Ich versichere Ihnen, dass dieser Code funktioniert, da er in einer Produktions-App verwendet wird und gut funktioniert. Es gibt also nichts, was wir wirklich tun können, um Ihnen zu helfen, nur auf der Grundlage einer Behauptung, dass es nicht funktioniert. : - / – bdrister