Re: NSTextContainer exclusionPaths not working on iOS without UITextView
Re: NSTextContainer exclusionPaths not working on iOS without UITextView
- Subject: Re: NSTextContainer exclusionPaths not working on iOS without UITextView
- From: Aki Inoue <email@hidden>
- Date: Thu, 21 Sep 2017 11:13:43 -0700
Steve,
You should be rendering using NSLayoutManager instead of -drawInRect:. The
method is handling NSTextStorage just as a mere NSAttributedString ignoring the
rest of objects connected.
Check out the documentation for -[NSLayoutManager
drawGlyphsInGlyphRange:atPoint:].
Aki
> On Sep 21, 2017, at 6:04 AM, Steve Mills <email@hidden> wrote:
>
> Didn't work the first time I sent this, because something messed up and
> thought the message was too large, when it's less than 2000 characters.
>
> No bites on apple-dev.groups.io, so I'll try here.
>
> 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?
>
> BTW, if I instead install a UITextView and set its exclusionPaths, it works.
> So does NSTextStorage not know enough to draw with the exclusionPaths, and I
> just need to install text views for each one instead?
>
> -(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
>
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden