Базовая анимация - использование `makeBackingLayer` не применяет Core Image Filter - PullRequest
3 голосов
/ 19 ноября 2011

Я создаю NSView на основе CALayer, который применяет фильтр маски к слою, а затем рисует слой.Когда я создаю новый слой и устанавливаю его на представление вручную в -(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, и результат выглядит следующим образом:

Layer Host

Но когда я это делаю (Layer backedстиль представления):

-(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];
}

Вид в итоге выглядит следующим образом:

Layer Backed View (Broken)

Два вопроса:

1 - Почему нет?t фильтр, примененный к слою при использовании makeBackingLayer?

2 - Как я могу использовать makeBackingLayer для генерации слоя вместо вызова setLayer?

РЕДАКТИРОВАТЬ: Изменение -(void)viewDidMoveToSuperView к следующему отображает слой так, как я хочу, но он все равно не отвечает на мой вопрос:

-(void)viewDidMoveToSuperview{
  [super viewDidMoveToSuperview];
  //manually set the layer
  [self setLayer:[self makeBackingLayer]];
  [self setWantsLayer:YES];
}

1 Ответ

3 голосов
/ 19 ноября 2011

Так как вы получаете доступ к свойствам слоя представления, вы должны сделать вид размещающим слоем, а не слоем с резервной копией.

Вы не можете использовать -makeBackingLayer для настройки слоя вида. В документации упоминается только одно применение этого метода:

В вашем классе представления переопределите -makeBackingLayer, чтобы вернуть автоматически выпущенный экземпляр вашего подкласса NSOpenGLLayer.

  1. Потому что вы должны использовать -setContentFilters:
  2. Вы не можете. Вы должны позвонить setLayer:

-makeBackingLayer - неправильное место для создания вашего пользовательского слоя. Вместо этого вы должны добавить новый метод (например, -makeHostLayer).

...