当视图控制器呈现在另一个视图控制器上时如何获取屏幕截图?

Posted

技术标签:

【中文标题】当视图控制器呈现在另一个视图控制器上时如何获取屏幕截图?【英文标题】:How to get the screenshot when a view controller is presented over another view controller? 【发布时间】:2013-08-26 11:37:04 【问题描述】:

我想获取当前屏幕的屏幕截图。

但每当 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】:

你可以简单地添加

ViewOnTop.alpha = 0.0;

到您要截屏的视图上方的视图。这将首先使 View on top 将其 alpha 属性降低到 0 从而使其几乎透明,然后您正在截屏

在此处添加上述代码

- (UIImage*)screenshot 

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

编辑:

对于同一代码中的viewcontroller,将dismissViewController 属性添加到正在呈现的视图中,以便最终可以看到您想要截屏的视图。

【讨论】:

我想获取MFMailComposeViewcontroller 的屏幕截图,但是每次截图时,都会绘制一个全黑的屏幕。什么都看不见。

以上是关于当视图控制器呈现在另一个视图控制器上时如何获取屏幕截图?的主要内容,如果未能解决你的问题,请参考以下文章

当滚动视图子视图不在屏幕上时,手势识别器不起作用

如何将视图控制器从视图控制器推送为全屏幕,呈现为半模式

在模态呈现另一个视图控制器后视图控制器会发生啥

在呈现模态视图时显示 UITabBar

如何正确呈现视图控制器?

Rails 在控制器动作中形成,在另一个视图中呈现?