我正在构建一个 CALayer 支持的 NSView,它将蒙版过滤器应用于图层,然后绘制图层。当我构建一个新层并在 -(void)viewDidMoveToSuperview)
中手动将其设置在 View 上时, View 会正确呈现,但是当我覆盖 -(CALayer *)makeBackingLayer
时过滤器未应用于图层。
这是有效的代码(图层主机 View 样式):
-(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,输出如下所示:
但是当我这样做时(图层支持 View 样式):
-(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];
}
View 最终看起来像这样:
两个问题:
1 - 为什么在使用 makeBackingLayer
时滤镜没有应用到层上?
2 - 如何使用 makeBackingLayer
生成图层而不是调用 setLayer
?
编辑:将 -(void)viewDidMoveToSuperView
更改为以下渲染层,就像我想要的那样,但它仍然没有回答我的问题:
-(void)viewDidMoveToSuperview{
[super viewDidMoveToSuperview];
//manually set the layer
[self setLayer:[self makeBackingLayer]];
[self setWantsLayer:YES];
}
最佳答案
由于您正在访问 View 层的属性,因此您必须使 View 成为宿主层而不是支持层。
您不能使用 -makeBackingLayer
来自定义 View 层。文档只提到了这种方法的一个应用:
In your view class, override -makeBackingLayer to return an autoreleased instance of your NSOpenGLLayer subclass.
- 因为你应该使用
-setContentFilters:
- 你不能。您必须调用
setLayer:
-makeBackingLayer
是创建自定义层的错误位置。您应该改为添加新方法(例如 -makeHostLayer
)。
关于objective-c - Core Animation - 使用 `makeBackingLayer` 不应用 Core Image Filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8192654/