2

On Apples Technical notes site, they posted code to screen capture. Everything works, except it does not capture files that are being previewed using QLPreviewController under iOS 6.

I'm wondering if they are using some new OpenGL ES to render the file preview so that it could not capture? In theory, this piece of code should be able to capture anything on screen right??

From http://developer.apple.com/library/ios/#qa/qa1703/_index.html

- (UIImage*)screenshot 
{
// 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();

UIGraphicsEndImageContext();

return image;
}
mskw
  • 10,063
  • 9
  • 42
  • 64
  • 2
    When I tested, i could capture the navigation bar but not the content of the document. I thought I read somewhere about the new security feature with ios 6 that prevents the previewed document from being captured. But i could not find the document to support this. – user523234 Nov 02 '12 at 09:42

1 Answers1

0

this doesnt sound similiar but this actually doesnt work for the same reason that this doesnt work: iOS 6 UIGestures (Tap) stops working with QLPreviewController


since ios 6 the QLPreviewController is actually a completely seperate app (seperate process and everything)

=> so when you push that, your whole app moves to the bg, including its window.

=> QlController is never really part of your window

Community
  • 1
  • 1
Daij-Djan
  • 49,552
  • 17
  • 113
  • 135