如何在另一个视图控制器上显示视图控制器时获取屏幕截图?

时间:2013-08-26 11:37:04

标签: iphone ios drawing screenshot uigraphicscontext

我想获得当前屏幕的截屏。

但是每当出现MFMailComposeViewController或任何其他视图控制器时,所绘制的屏幕截图都没有黑屏。

//Code to draw what ever is present currently on the screen
- (UIImage*)screenshot {

CGSize imageSize = [[UIScreen mainScreen] bounds].size;


if (NULL != UIGraphicsBeginImageContextWithOptions)
    UIGraphicsBeginImageContextWithOptions(imageSize,YES, 0.0);
else
    UIGraphicsBeginImageContext(imageSize);



CGContextRef context = UIGraphicsGetCurrentContext();

// Iterate over every window from back to front
for (UIWindow *currentWindow in [[UIApplication sharedApplication] windows])
{
    if (![currentWindow respondsToSelector:@selector(screen)] || [currentWindow screen] == [UIScreen mainScreen])
    {



        CGContextSaveGState(context);

        NSLog(@"current alpha %f", currentWindow.alpha);

        CGContextSetAlpha(context, currentWindow.alpha);

        // Center the context around the window's anchor point
        CGContextTranslateCTM(context, [currentWindow center].x, [currentWindow center].y );
        // Apply the window's transform about the anchor point
        CGContextConcatCTM(context, [currentWindow transform]);
        // Offset by the portion of the bounds left of and above the anchor point
        CGContextTranslateCTM(context,
                              -[currentWindow bounds].size.width * [[currentWindow layer] anchorPoint].x,
                              -([currentWindow bounds].size.height ) * [[currentWindow layer] anchorPoint].y );

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

        // Restore the context
        CGContextRestoreGState(context);


    }
}

// Retrieve the screenshot image
UIImage *image = UIGraphicsGetImageFromCurrentImageContext().retain;

UIGraphicsEndImageContext();

return [image autorelease];}

当呈现视图控制器时,上面代码中的for循环迭代多次,当呈现mfmailcomposeviewcontroller时我得到一个空白图像。虽然下面的视图控制器的标签栏控制器是可见的。

但是当我按下邮件编制器的取消按钮时,屏幕上显示的操作表也没有被绘制。

这是由于UIGraphicsBeginImageContextWithOptions中的不透明度吗?

我想知道在呈现另一个视图控制器时如何获取屏幕图像。

是否无法获取默认控制器截图?

请帮忙。

提前致谢。

1 个答案:

答案 0 :(得分:0)

你可以简单地添加

ViewOnTop.alpha = 0.0;

到您要截取屏幕截图之上的视图。这将首先使 View on top alpha 属性减少为 0 ,从而使其几乎透明然后你正在拍摄截图

在此处添加以上代码

- (UIImage*)screenshot {

ViewOnTop.alpha = 0.0;
............
...................
}

编辑:

对于相同代码中的viewcontroller,将dismissViewController属性添加到正在显示的视图中,以便最终显示您想要屏幕截图的视图。