捕获带有状态栏的iPhone屏幕?

时间:2009-08-17 23:58:29

标签: iphone objective-c screenshot

我正在寻找一种在iPhone上捕获屏幕截图的方法,其中包含顶级状态栏,我目前正在使用以下代码:

    UIGraphicsBeginImageContext(self.view.bounds.size); //self.view.window.frame.size
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);

上面的代码成功获取了iPhone UIView的屏幕截图,但不包括顶级状态栏(在它的位置只是一个空白的20px空间)。

4 个答案:

答案 0 :(得分:11)

从iOS 7开始,您可以使用

执行此而不使用私有API
UIView *screenshotView = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];

请参阅我对这个问题的回答:

Moving status bar in iOS 7

答案 1 :(得分:3)

您可以通过调用私有API UIGetScreenImage来获取屏幕的全部内容。有关详细信息,请参阅我的previous answersimilar question

答案 2 :(得分:1)

截至2009年10月8日,UIGetScreenImage的使用让我的应用被拒绝了! :(我不建议使用它。我相信Apple正在尝试清理所有应用程序并使它们符合新的3.x操作系统/ API。我正在寻找替代方案。如果有人有任何建议。视频API?

答案 3 :(得分:1)

为什么不将整个UIWindow渲染到图像上下文中,而不是使用私有API?在代码中用self.view替换self.view.window可能就足够了。

您还可以将当前窗口作为[UIApplication sharedApplication]实例的属性。状态栏可能位于单独的窗口层上,也许您必须按顺序渲染窗口。

这样的事情:

UIGraphicsBeginImageContext(self.view.window.frame.size);
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
   [window.layer renderInContext:UIGraphicsGetCurrentContext()];
}
UIImage *screenshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);

无论如何,您可能不需要使用私有API。