【发布时间】:2011-11-19 22:55:58
【问题描述】:
我正在构建一个支持 CALayer 的 NSView,它将蒙版过滤器应用于图层,然后绘制图层。当我在-(void)viewDidMoveToSuperview) 中手动构建一个新层并在视图上设置它时,视图会正确呈现,但是当我覆盖-(CALayer *)makeBackingLayer 时,过滤器不会应用于该层。
这是有效的代码(图层主机视图样式):
-(void)viewDidMoveToSuperview{
[super viewDidMoveToSuperview];
CIFilter *filter = [CIFilter filterWithName:@"CIBlendWithMask"];
[filter setValue:[self transparentImage] forKey:@"inputBackgroundImage"];
[filter setValue:[self maskImage] forKey:@"inputMaskImage"];
self.layer = [TransparentLayer layer];
self.layer.backgroundColor = CGColorCreateGenericRGB(0, 1, 1, 1);
[self.layer setPosition:CGPointMake(0 ,0)];
[self.layer setAnchorPoint:CGPointMake(0 ,0)];
[self.layer setBounds:CGRectMake(0 ,0 ,200, 200)];
self.layer.filters = [NSArray arrayWithObject:filter];
[self setWantsLayer:YES];
[self.layer setNeedsDisplay];
[self setNeedsDisplay:YES];
}
这会渲染 CALayer,输出如下所示:
但是当我这样做时(图层支持的视图样式):
-(CALayer *)makeBackingLayer{
CIFilter *filter = [CIFilter filterWithName:@"CIBlendWithMask"];
[filter setValue:[self transparentImage] forKey:@"inputBackgroundImage"];
[filter setValue:[self maskImage] forKey:@"inputMaskImage"];
TransparentLayer *backingLayer = [TransparentLayer layer];
backingLayer.backgroundColor = CGColorCreateGenericRGB(0, 1, 1, 1);
[backingLayer setPosition:CGPointMake(0 ,0)];
[backingLayer setAnchorPoint:CGPointMake(0 ,0)];
[backingLayer setBounds:CGRectMake(0 ,0 ,200, 200)];
backingLayer.filters = [NSArray arrayWithObject:filter];
return backingLayer;
}
-(void)viewDidMoveToSuperview{
[super viewDidMoveToSuperview];
[self setWantsLayer:YES];
}
视图最终看起来像这样:
两个问题:
1 - 为什么在使用makeBackingLayer时没有在图层上应用过滤器?
2 - 如何使用makeBackingLayer 生成图层而不是调用setLayer?
编辑:将-(void)viewDidMoveToSuperView 更改为以下内容会像我想要的那样呈现图层,但它仍然没有回答我的问题:
-(void)viewDidMoveToSuperview{
[super viewDidMoveToSuperview];
//manually set the layer
[self setLayer:[self makeBackingLayer]];
[self setWantsLayer:YES];
}
【问题讨论】:
标签: objective-c macos cocoa core-animation ios5