Antonio Junior
Antonio Junior

Reputation: 500

Path not visible under UIGraphicsBeginImageContextWithOptions - SpriteKit

I'm drawing a path in my SKScene to show the track of my object. Everything works fine, I can draw the path for all points and add it to scene. The problem happens when I try to printscreen my scene, everything appears but the path. Where am i doing it wrong?

- (void)drawPathTrackBall
{
    // length of my nsmutablearray with the object track
    NSUInteger len = [_trackBallPath count];

    // start image context
    CGRect bounds = self.scene.view.bounds;
    UIGraphicsBeginImageContextWithOptions(bounds.size, YES, [UIScreen mainScreen].scale);
    [self.view drawViewHierarchyInRect:bounds afterScreenUpdates:YES];

    // draw my path
    SKShapeNode *line = [[SKShapeNode alloc] init];
    CGMutablePathRef linePath = CGPathCreateMutable();
    CGPathMoveToPoint(linePath, NULL, _ballStartX, _ballStartY);

    for(NSUInteger i=0; i<len; ++i)
    {
        NSValue *nsPoint = [_trackBallPath objectAtIndex:i];
        CGPoint p = nsPoint.CGPointValue;
        CGPathAddLineToPoint(linePath, NULL, p.x, p.y);
    }

    line.path = linePath;
    line.lineWidth = 0.5f;
    line.strokeColor = [UIColor redColor];

    [_container addChild:line];

    _screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

Thanx

Upvotes: 0

Views: 329

Answers (1)

Yurii Romanchenko
Yurii Romanchenko

Reputation: 848

First of all - you're creating simple path, its not connected or drawed to somewhere in your code to context. I didn't learn SpriteKit yet, but I know CoreGraphics well and I think you just can't simply use there SpriteKit API to create a screenshot. Instead try to use native CoreGraphics methods.

To make your code work you need:

  • Obtain context to which you will draw.

  • As you've already created a path - just add it to context.

  • Then stroke/fill it.

To obtain current context to draw call: CGContextRef ctx = UIGraphicsGetCurrentContext();

To add path use : CGContextAddPath(ctx, path);

To stroke/fill use CGContextStrokePath(ctx); / CGContextFillPath(ctx);

So your updated code should look like(notice I've removed code related to SpriteKit stuff):

- (void)drawPathTrackBall
{
    // length of my nsmutablearray with the object track
    NSUInteger len = [_trackBallPath count];

    // start image context
    CGRect bounds = self.scene.view.bounds;
    UIGraphicsBeginImageContextWithOptions(bounds.size, YES, [UIScreen mainScreen].scale);
    [self.view drawViewHierarchyInRect:bounds afterScreenUpdates:YES];

    CGContextRef ctx = UIGraphicsGetCurrentContext(); // Obtain context to draw.
    CGMutablePathRef linePath = CGPathCreateMutable();
    CGPathMoveToPoint(linePath, NULL, _ballStartX, _ballStartY);

    for(NSUInteger i=0; i<len; ++i)
    {
        NSValue *nsPoint = [_trackBallPath objectAtIndex:i];
        CGPoint p = nsPoint.CGPointValue;
        CGPathAddLineToPoint(linePath, NULL, p.x, p.y);
    }

    // I've exchanged SpriteKit node API calls with CoreGraphics equivalents.
    CGContextSetLineWidth(ctx, 0.5f); 
    CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
    CGContextAddPath(ctx, linePath);
    CGContextStrokePath(ctx);

    _screenshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}

Try it.

Upvotes: 1

Related Questions