2010-06-23 12 views
5

Próbuję narysować odbicie kształtu za pomocą kakao. Zastosowałem już NSAffineTransform i poprawnie przerysowałem kształt, ale teraz nie mogę wymyślić, jak narysować na nim maskę alfa. Używam operację NSCompositeDestinationOut, ale to daje mi niechcianej wynik: alt text http://img687.imageshack.us/img687/2417/capturedcran20100623094.pngKakao: używanie NSGradient jako maski do rysowania poniżej

Nie jestem do końca pewien, jak to naprawić - Muszę zrobić to więc gradient działa jedynie jako maski alfa i nie jest faktycznie wyświetlany. Czy używam niewłaściwego trybu compositing?

Dzięki! Oto kod gradientu w razie potrzeby:

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

Musisz utworzyć obraz maski, kompozytowe, które z obrazu źródłowego, a następnie narysować wynikowy obraz. http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_images/dq_images.html – hooleyhoop

+0

Ale obiekt, który maskuję, nie jest obrazem, jest dynamicznie rysowane. Czy istnieje sposób, w jaki mogę go narysować do obrazu i użyć go? –

Odpowiedz

2

Tak. Oto przykład kodu, którego używamy do tego celu. Używa obrazu źródłowego i ma trochę zabawnego biznesu z czynnikiem skali, ale powinieneś być w stanie użyć podstawowej struktury i opcji kompozycyjnych, aby zrobić to, czego potrzebujesz. (Ten kod jest w [reflectionImage lockFocus] bloku, i samo to NSImage że robimy odbicie.)

// 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, teraz rysuję kształt w NSImage i komponuję go za pomocą metody, którą pokazałeś, ale wszystko, co jest wyświetlane, to czarna ramka. –

+0

Musisz być bardziej szczegółowy - jak na stronie, zamieść swój kod - o tym, co dokładnie robisz. Zapewniam Cię, że ten kod działa, ponieważ jest używany w aplikacji produkcyjnej i działa dobrze, więc nic nie możemy zrobić, aby ci pomóc, opierając się tylko na stwierdzeniu, że to nie działa. : - / – bdrister

Powiązane problemy