1

I'm using this method to take a screenshot of my app:

+ (NSData*)TakeScreenshot 
{
    // Create a graphics context with the target size
    // On iOS 4 and later, use UIGraphicsBeginImageContextWithOptions to take the scale into consideration
    // On iOS prior to 4, fall back to use UIGraphicsBeginImageContext

    CGSize imageSize = [[UIScreen mainScreen]bounds].size;
    if (NULL != UIGraphicsBeginImageContextWithOptions)
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0);
    else
        UIGraphicsBeginImageContext(imageSize);

    CGContextRef context = UIGraphicsGetCurrentContext();

    // Iterate over every window from back to front
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) 
    {
        if (![window respondsToSelector:@selector(screen)] || [window screen] == [UIScreen mainScreen])
        {
            // -renderInContext: renders in the coordinate space of the layer,
            // so we must first apply the layer's geometry to the graphics context
            CGContextSaveGState(context);
            // Center the context around the window's anchor point
            CGContextTranslateCTM(context, [window center].x, [window center].y);
            // Apply the window's transform about the anchor point
            CGContextConcatCTM(context, [window transform]);
            // Offset by the portion of the bounds left of and above the anchor point

            CGContextTranslateCTM(context,
                                  -[window bounds].size.width * [[window layer] anchorPoint].x,
                                  -[window bounds].size.height * [[window layer] anchorPoint].y);

            // Render the layer hierarchy to the current context
            [[window layer] renderInContext:context];

            // Restore the context
            CGContextRestoreGState(context);


        }
    }


    // Retrieve the screenshot image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    NSData *imageData = UIImageJPEGRepresentation(image, 100);

    UIGraphicsEndImageContext();

    return imageData;
}

The problem is, I don't see the status bar. I'm getting only a white area without the status bar. How can I take a screenshot of the whole screen, with the status bar and other controls like tabbar, navigation bar and etc.

Thanks in advance!

Yosi Dahan
  • 441
  • 6
  • 19
  • possible duplicate of [How to take a screenshot programmatically](http://stackoverflow.com/questions/2200736/how-to-take-a-screenshot-programmatically) – Stephen C May 22 '12 at 12:45

2 Answers2

1

What you're using is more or less the official way Apple suggests to take a screenshot.

The problem is that this method takes a screenshot of your application output on screen and not of your whole screen. The status bar is in its own window and could not be taken within your application.

You should create your own status bar as an image and add it to your project or just cut the part of the screenshot you don't need.

Then, I suggest to search the forum for possible duplicate of your question, like this one: Capturing full screenshot with status bar in iOS programmatically

Community
  • 1
  • 1
Giuseppe Garassino
  • 2,272
  • 1
  • 27
  • 47
0

There is no public method which allows you to take a screenshot of the entire screen (i.e. with the status bar). There is a private method though UIGetScreenImage which allows you to use achieve this functionality. But, since it's a private method you will get your app rejected if you submit it to the App Store.

bobbypage
  • 2,157
  • 2
  • 21
  • 21