objective-c - Core Animation - 使用 `makeBackingLayer` 不应用 Core Image Filter

标签 objective-c macos cocoa core-animation ios5

我正在构建一个 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,输出如下所示:

Layer Host

但是当我这样做时(图层支持 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 最终看起来像这样:

Layer Backed View (Broken)

两个问题:

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.

  1. 因为你应该使用 -setContentFilters:
  2. 你不能。您必须调用 setLayer:

-makeBackingLayer 是创建自定义层的错误位置。您应该改为添加新方法(例如 -makeHostLayer)。

关于objective-c - Core Animation - 使用 `makeBackingLayer` 不应用 Core Image Filter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8192654/

相关文章:

objective-c - 在类别接口(interface)/实现中设置新属性

objective-c - 如何将plist中的日期设置为[NSDate dateWithTimeIntervalSince1970 :0]?

macos - OS X 如何将项目添加到应用程序的顶部菜单?

objective-c - 在 cocoa 中水平切片 NSImage

objective-c - 'instance method not found' 警告的 -Wsomething 标志是什么?

ios - 创建新问题 GitHub iOS

c++ - 在事件的 OS X 桌面上保留一个窗口

objective-c - 数据库错误 : variable not available

macos - Mac OS PackageMaker .app bundle 未安装?

macos - OS X 上的 wxHaskell