Я создаю 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 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];
}
Вид в итоге выглядит следующим образом:
Два вопроса:
1 - Почему нет?t фильтр, примененный к слою при использовании makeBackingLayer
?
2 - Как я могу использовать makeBackingLayer
для генерации слоя вместо вызова setLayer
?
РЕДАКТИРОВАТЬ: Изменение -(void)viewDidMoveToSuperView
к следующему отображает слой так, как я хочу, но он все равно не отвечает на мой вопрос:
-(void)viewDidMoveToSuperview{
[super viewDidMoveToSuperview];
//manually set the layer
[self setLayer:[self makeBackingLayer]];
[self setWantsLayer:YES];
}