2011-01-17 12 views
1

Ich arbeite an einer Kiosk-Anwendung. Ich möchte ein Logo in der Mitte haben (was funktioniert). Jetzt versuche ich einige schwimmende Schichten um das Logo herum hinzuzufügen. Ich kann die Ebene (in drawDots) zeichnen, aber wenn ich einen Filter hinzufüge, bedeckt sie die von mir gezeichneten Logo-Ebenen. Ich habe den ganzen wichtigen Code hier kopiert. Wenn ich die Zeile, die das filters -Array auf der dotLayer setzt, auskommentiere, ist das violette Quadrat für die Punktschicht und das Logo wieder sichtbar, aber wenn ich den Filter anwende, ist das Logo nicht sichtbar. Ich verstehe es nicht wirklich, da ich die richtigen Frames auf diesen setze. Ich habe auch versucht, etwas mit einem Sublayer auf dem dotLayer zu tun, um zu sehen, ob das helfen würde.CALayer-Filter deckt andere Unterlayer ab

- (void)awakeFromNib 
{ 
// Initialization code here. 
// The cursor isn't used for selection, so we hide it 
[NSCursor hide]; 

// go full screen, as a kiosk application 
[self enterFullScreenMode:[self.window screen] withOptions:NULL]; 

[self setupLayers]; 

[self drawDots]; 

// Make the window the first responder to get keystrokes 
[self.window makeFirstResponder:self]; 

// bring the window to the front 
[self.window makeKeyAndOrderFront:self]; 
} 

- (void)drawDots 
{ 
CGColorRef purpleColor = CGColorCreateGenericRGB(0.604, 0.247, 0.463, 1.0); 
CGColorRef transparentColor = CGColorCreateGenericRGB(0, 0, 0, 1.0); 

// CALayer *something = [CALayer layer]; 
// something.frame = NSMakeRect(15, 15, 60, 60); 
CALayer *dotLayer = [CALayer layer]; 
dotLayer.frame = NSMakeRect(15, 15, 30, 30); 
dotLayer.backgroundColor = purpleColor; 

CIFilter *gradientFilter = [CIFilter filterWithName:@"CIGaussianGradient"]; 
[gradientFilter setDefaults]; 
[gradientFilter setValue:(id)[CIColor colorWithCGColor:purpleColor] forKey:@"inputColor0"]; 
[gradientFilter setValue:(id)[CIColor colorWithCGColor:transparentColor] forKey:@"inputColor1"]; 
[gradientFilter setValue:(id)[NSNumber numberWithFloat:20.0] forKey:@"inputRadius"]; 

// dotLayer.compositingFilter = gradientFilter; 

dotLayer.filters = [NSArray arrayWithObject:(id)gradientFilter]; 

[rootLayer addSublayer:dotLayer]; 
// [dotLayer addSublayer:something]; 
// 
// [rootLayer addSublayer:dotLayer]; 
} 

- (void)setupLayers 
{ 
// Setup vars 
CGFloat mirroredOffset = 10.0f; 

CGColorRef blackColor = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 1.0); 
CGColorRef transparentColor = CGColorCreateGenericRGB(0.0, 0.0, 0.0, 0.0); 

// Get the image 
logo = [NSImage imageNamed:@"logo_300.png"]; 

// Get the positioning of the logo - middle of the screen 
CGFloat logoWidth = [logo size].width; 
CGFloat logoHeight = [logo size].height; 

CGFloat imageX = [self frame].size.width/2 - logoWidth/2; 
CGFloat imageY = [self frame].size.height/2 - logoHeight/2; 

// Create the layer for the all content to be drawn on 
rootLayer = [CALayer layer]; 
rootLayer.geometryFlipped = YES; 
rootLayer.opaque = YES; 
rootLayer.frame = [self frame]; 
rootLayer.backgroundColor = blackColor; 
[self setLayer:rootLayer]; 

NSRect imageRect = NSMakeRect(imageX, imageY, logoWidth, logoHeight * 2 + mirroredOffset); 

// Create the layer that holds the logo 
CALayer *logoLayer = [CALayer layer]; 
logoLayer.frame = NSMakeRect(imageX, imageY, logoWidth, logoHeight); 

[rootLayer addSublayer:logoLayer]; 

// Create the layer for the main logo 
CALayer *mainLogo = [CALayer layer]; 
mainLogo.frame = NSMakeRect(0, 0, logoWidth, logoHeight); 
mainLogo.contents = logo; 

[logoLayer addSublayer:mainLogo]; 

// Create the mirrored layer 
CALayer *logoMirroredLayer = [CALayer layer]; 
logoMirroredLayer.frame = NSMakeRect(0, logoHeight + mirroredOffset, logoWidth, logoHeight); 

[logoLayer addSublayer:logoMirroredLayer]; 

// Create the layer for the logo 
CALayer *logoBase = [CALayer layer]; 
logoBase.frame = NSMakeRect(0, 0, logoWidth, logoHeight); 
logoBase.contents = logo; 

[logoMirroredLayer addSublayer:logoBase]; 

// Create the gradient to make the mirrored effect 
CAGradientLayer *gradientCover = [CAGradientLayer layer]; 
gradientCover.frame = NSMakeRect(0, 0, imageRect.size.width, imageRect.size.height); 
gradientCover.colors = [NSArray arrayWithObjects:(id)blackColor, (id)transparentColor, nil]; 
gradientCover.locations = [NSArray arrayWithObjects:(id)[NSNumber numberWithFloat:0.0f], (id)[NSNumber numberWithFloat:1.0f], nil]; 

[logoMirroredLayer addSublayer:gradientCover]; 

// Flip the mirrored layer 
CGAffineTransform rotateTransform = CGAffineTransformRotate(CGAffineTransformIdentity, 180.0f * M_PI/180); 
[logoMirroredLayer setAffineTransform:rotateTransform]; 

// Make the mirrored layer see through 
logoMirroredLayer.opacity = 0.3f; 

[self setWantsLayer:YES]; 
} 


@end 

Was ich nicht verstehe, ist, dass die anderen Unterschichten vor diesem hinzugefügt werden und den Rahmen für diese Schicht deckt nicht, wo das Logo angezeigt wird.

+0

Gibt es eine Dokumentation, die dieses Verhalten angibt? – Brian

Antwort

0

Wie sieht Ihre CALayer-Maske aus? Der CIF-Filter könnte Ihren Alphakanal auf Nicht-Null setzen und so die dahinter liegenden Schichten verdecken.

Verwandte Themen