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.
Gibt es eine Dokumentation, die dieses Verhalten angibt? – Brian