5

我正在尝试使用 Cocoa 绘制形状的反射。我已经应用了一个 NSAffineTransform 并成功地重绘了形状,但现在我不知道如何在它上面绘制一个 alpha 蒙版。我正在使用一个NSCompositeDestinationOut操作,但它给了我一个不需要的结果:alt text http://img687.imageshack.us/img687/2417/capturdcran20100623094.png

我不完全确定如何解决这个问题 - 我需要这样做,以便渐变仅充当 alpha 蒙版并且实际上不显示。我是否使用了错误的合成模式?

谢谢!如果需要,这是渐变代码:

- (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];
}
4

1 回答 1

2

是的。这是我们用来执行此操作的代码示例。它使用源图像,并且有一点有趣的比例因子,但你应该能够使用基本结构和合成选择来做你需要的事情。(此代码在 [reflectionImage lockFocus] 块中,self 是我们正在对其进行反射的 NSImage。)

// 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];
于 2010-06-23T23:41:49.743 回答