2010-06-23 9 views
5

Estoy tratando de dibujar la reflexión de una forma usando Cocoa. Ya he aplicado un NSAffineTransform y redibujado la forma con éxito, pero ahora no puedo imaginar cómo dibujar una máscara alfa sobre él. Estoy usando una operación NSCompositeDestinationOut, pero me está dando un resultado no deseado: alt text http://img687.imageshack.us/img687/2417/capturedcran20100623094.pngCocoa: usando un NSGradient como máscara para dibujar debajo

No estoy exactamente seguro de cómo solucionar este problema - que necesito para que sea por lo que el gradiente de sólo actúa como una máscara alfa y no se realmente se muestra. ¿Estoy usando el modo de composición incorrecto?

Gracias! Aquí está el código de degradado si es necesario:

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

Es necesario crear una imagen de máscara, compuesta que la imagen de origen con, luego roba la imagen resultante. http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html – hooleyhoop

+0

Pero el objeto que estoy enmascarando no es una imagen, es un control dibujado dinámicamente. ¿Hay alguna manera de que logre que dibuje una imagen y la use? –

Respuesta

2

Yep. Aquí hay un ejemplo del código que usamos para hacer esto. Utiliza una imagen de origen y tiene un poco de negocio divertido con un factor de escala, pero debería poder usar la estructura básica y las opciones de composición para hacer lo que necesita. (Este código se encuentra dentro del bloque [reflectionImage lockFocus], y yo es la NSImage que estamos haciendo el reflejo de.)

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

Bien, ahora estoy dibujando la forma en un NSImage y computándola usando el método que mostraste, pero todo lo que se muestra es una caja negra. –

+0

Tendrá que ser más específico, como en, publicar su código, sobre lo que está haciendo exactamente. Le aseguro que este código funciona, ya que se lo utiliza en una aplicación de producción y le está yendo bien, así que no hay nada que podamos hacer para ayudarlo basándonos solo en la afirmación de que no está funcionando. : - / – bdrister

Cuestiones relacionadas