我正在构建一个使用 CALayer 的 NSView,该视图应用遮罩过滤器到层上,然后绘制这个层。当我手动在
下面是能正常工作的代码(使用层主机视图样式):
这将呈现CALayer并输出结果如下所示: 但是当我使用此方法(支持图层的视图样式)时:
视图最终看起来是这样的: 两个问题:
1 - 使用
2 - 我如何使用
编辑:将
-(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];
}
makeBackingLayer
来创建自己的后备层,并且在核心动画编程指南的“设置图层对象”一节中有记录。你必须调用setWantsLayer:
来实现这个功能。其余部分是正确的,后备层并不是托管层。 - Stephan