2010-06-23 4 views
5

Sto provando a disegnare il riflesso di una forma utilizzando Cocoa. Ho già applicato un NSAffineTransform e ridisegnato la forma con successo, ma ora non riesco a capire come disegnare una maschera alfa su di esso. Sto utilizzando un'operazione NSCompositeDestinationOut, ma mi sta dando un risultato indesiderato: alt text http://img687.imageshack.us/img687/2417/capturedcran20100623094.pngCacao: Utilizzo di un NSGradient come maschera per disegnare sotto di esso

io non sono esattamente sicuro di come risolvere questo problema - ho bisogno di farlo così il gradiente agisce solo come una maschera alfa e non è effettivamente visualizzato. Sto usando la modalità compositing sbagliata?

Grazie! Ecco il codice gradiente, se necessario:

- (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

È necessario creare un'immagine maschera, composita che la propria immagine originale con, quindi disegnare l'immagine risultante. http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html – hooleyhoop

+0

Ma l'oggetto che sto mascherando non è un'immagine, è un controllo disegnato in modo dinamico. C'è un modo per ottenerlo per disegnare un'immagine e usarla? –

risposta

2

Sì. Ecco un esempio del codice che usiamo per fare questo. Utilizza un'immagine di origine e ha un po 'di business divertente con un fattore di scala, ma dovresti essere in grado di utilizzare la struttura di base e le scelte di compositing per fare ciò che ti serve. (Questo codice è all'interno del blocco [reflectionImage lockFocus], e l'auto è il NSImage che stiamo facendo il riflesso.)

// 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

Ok, ora sto disegnando la forma in NSImage e la compongo usando il metodo che hai mostrato, ma tutto ciò che viene visualizzato è una scatola nera. –

+0

Dovrai essere più specifico - come in, postare il tuo codice - su cosa esattamente stai facendo. Ti assicuro che questo codice funziona, dato che è usato in un'app di produzione e sta andando bene, quindi non c'è nulla che possiamo davvero fare per aiutarti basandoti solo sull'affermazione che non funziona. : - / – bdrister

Problemi correlati