NSTextContainer exclusionPaths not working on iOS


Steve Mills
 

I'm trying to use exclusionPaths for the first time and am not having any success. For now, I'm just creating the stuff on the fly in my drawLayer:inContext: method:. The string draws, but doesn't exclude any path no matter what I set it to. I'm also not that familiar with the whole NSTextStorage/NSLayoutManager/NSTextContainer family, other than using snippets of code in the past, so it could be I'm doing something dumb. Any ideas?

-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx
{
if([layer.name isEqualToString:@"balloons"]) {
UIGraphicsPushContext(ctx);

CGRect box = CGRectMake(0, 0, 400, 400);
NSTextStorage* storage = [[NSTextStorage alloc] initWithString:@"I like little pigs who run and scurry away from the butcher, because the butcher is carrying a large cleaver and wants to chop them up into delicious sandwiches!" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:36]}];
UIBezierPath* bez = [UIBezierPath bezierPathWithRect:CGRectMake(100, 100, 100, 100)];
NSLayoutManager* lman = [NSLayoutManager new];

[storage addLayoutManager:lman];

NSTextContainer* cont = [[NSTextContainer alloc] initWithSize:box.size];

cont.exclusionPaths = @[bez];
[lman addTextContainer:cont];

// Trying different things to see if they make it work - nope.
[lman textContainerChangedGeometry:cont];
[lman invalidateLayoutForCharacterRange:NSMakeRange(0, storage.length) actualCharacterRange:nil];

[storage drawInRect:box];

UIGraphicsPopContext();
}
}

--
Steve Mills
Drummer, Mac geek

Join {cocoa@apple-dev.groups.io to automatically receive all group messages.