Cocoa: использование NSGradient в качестве маски для рисования под ним

Я пытаюсь нарисовать отражение формы с помощью Cocoa. Я уже применил NSAffineTransform и успешно перерисовал фигуру, но теперь не могу понять, как нарисовать поверх нее альфа-маску. Я использую операцию NSCompositeDestinationOut, но она дает нежелательный результат:http://img687.imageshack.us/img687/2417/capturedcran20100623094.png

Я не совсем уверен, как это исправить - мне нужно сделать так, чтобы градиент действовал только как альфа-маска и фактически не отображался. Я использую неправильный режим композитинга?

Спасибо! Вот код градиента, если необходимо:

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

person Jon Gauthier    schedule 23.06.2010    source источник
comment
Вам нужно создать изображение маски, скомпоновать его с исходным изображением, а затем нарисовать результирующее изображение. developer.apple.com/iphone/library/ документация/   -  person hooleyhoop    schedule 23.06.2010
comment
Но объект, который я маскирую, — это не изображение, а динамически отрисовываемый элемент управления. Есть ли способ заставить его рисовать изображение и использовать его?   -  person Jon Gauthier    schedule 23.06.2010


Ответы (1)


Ага. Вот пример кода, который мы используем для этого. Он использует исходное изображение и немного забавно работает с коэффициентом масштабирования, но вы должны иметь возможность использовать базовую структуру и варианты компоновки, чтобы делать то, что вам нужно. (Этот код находится в блоке [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];
person bdrister    schedule 23.06.2010
comment
Хорошо, теперь я рисую фигуру в NSImage и компоную ее, используя метод, который вы показали, но все, что отображается, — это черный ящик. - person Jon Gauthier; 24.06.2010
comment
Вам нужно быть более конкретным — например, опубликовать свой код — о том, что именно вы делаете. Уверяю вас, что этот код работает, поскольку он используется в рабочем приложении, и работает нормально, поэтому мы ничем не можем помочь вам, основываясь только на утверждении, что он не работает. :-/ - person bdrister; 25.06.2010