Question

I've just wondered about how give negative space to a NSView and and because I can't describe it properly in words I will show you a picture of the desired effect:

http://s16.postimg.org/lci7s2s8l/stackoverflow_problem.jpg

Please don't feel afraid to ask further questions.

Thanks in advance.

Was it helpful?

Solution

One of the options is to setup the following layers' hierarchy:

CATextLayer
`-CALayer with desired backgroundColor and CISourceOutCompositing compositingFilter

The corresponding code looks like

// Setup layer-hosting view.
NSView *view = [[NSView alloc] initWithFrame:viewFrame];
view.wantsLayer = YES;
view.layer = [CALayer layer];
view.layerUsesCoreImageFilters = YES;

CATextLayer *textLayer = [CATextLayer layer];
textLayer.string = @"Masked Text";
textLayer.frame = NSRectToCGRect(viewFrame);
[view.layer addSublayer:textLayer];

CALayer *colorLayer = [CALayer layer];
colorLayer.backgroundColor = [[NSColor greenColor] CGColor];
colorLayer.frame = NSRectToCGRect(viewFrame);
[textLayer addSublayer:colorLayer];

CIFilter *filter = [CIFilter filterWithName:@"CISourceOutCompositing"];
[filter setDefaults];
colorLayer.compositingFilter = filter;

Updated: to have more flexibility with positioning text you can employ the following hierarchy:

CALayer - this layer should stay empty (let's call it emptyLayer)
|- CATextLayer
`- CALayer with CISourceOutCompositing compositingFilter

In this case textLayer can be smaller than emptyLayer and can be positioned the way you want.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top