Cacao: El uso de un NSGradient como una máscara para dibujar debajo de ella
-
29-09-2019 - |
Pregunta
Estoy intentando llamar la reflexión de una forma utilizando cacao. Ya he solicitado un NSAffineTransform y vuelto a trazar la forma con éxito, pero ahora no puedo encontrar la manera de dibujar una máscara alfa sobre ella. Estoy usando una operación NSCompositeDestinationOut
, pero me está dando un resultado no deseado: alt text http: //img687.imageshack.us/img687/2417/capturedcran20100623094.png
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 muestra realmente . ¿Estoy utilizando el modo de composición mal?
Gracias! Aquí está el código de gradiente 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];
}
Solución
Sí. He aquí un ejemplo del código que usamos para hacer esto. Utiliza una imagen de origen, y tiene un poco de negocios divertido con un factor de escala, pero debe ser capaz de utilizar la estructura básica y de composición opciones 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];