捕获包含状态栏的iPhone屏幕?

捕获包含状态栏的iPhone屏幕?,iphone,objective-c,screenshot,Iphone,Objective C,Screenshot,我正在寻找一种在iPhone上捕获屏幕截图的方法,包括顶部的状态栏,我目前使用以下代码: UIGraphicsBeginImageContext(self.view.bounds.size); //self.view.window.frame.size [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *viewImage = UIGraphicsGetImageFromCurrentImag

我正在寻找一种在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的空白)。

您可以通过调用私有API
UIGetScreenImage
获取屏幕的全部内容。有关详细信息,请参阅my to a。

自2009年10月8日起,使用UIGetScreenImage导致我的应用被拒绝!:(我不建议使用它。我相信苹果正在尝试清理所有应用程序,使其符合新的3.x OS/API。我正在寻找替代方案。如果有人有任何建议。视频API?

而不是使用私有API,为什么不将整个UIWindow呈现到图像上下文中?这可能足以取代
self.vie在代码中使用
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。

从iOS 7开始,您可以在不使用私有API的情况下使用

UIView *screenshotView = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO];
见我对这个问题的回答:


我以前读过关于这个私有API函数的文章,我很好奇苹果是否会接受iPhone应用程序使用私有API函数?使用私有API的感觉各不相同。我的看法是:1)使用私有API违反苹果的规则,是其中之一(少之又少)你的应用程序可能会被拒绝或从应用商店中撤出;但是2) 像屏幕截图这样简单的东西很可能在雷达下飞行,而不会被审查者注意到;然而。。。3) 苹果可能会在未来的任何时候,以任何方式,出于任何原因,在不发出任何警告的情况下,以任何形式,以任何方式更改该API。我觉得任何使用私有API的行为都会让你在支持方面感到头疼,并可能造成糟糕的用户体验。在这种情况下,我认为如果功能是动态访问的,并且考虑到了故障,就不会有太大的风险:应用程序可以使用标准方法返回到屏幕截图。在我的回答中,它的具体实现使用了静态链接,这是读者的一个练习。唉,使用UIApplication的keyWindow属性会导致同样的问题——黑色状态栏。显然,没有(合法的)方法来捕获整个屏幕。状态栏在一个单独的窗口中。您可以循环使用UIApplication的
窗口
属性,并按顺序将它们渲染到同一个图像上;把所有的窗户都画出来。我用一些代码更新了我的答案。(实际上,我只想要状态栏,但我会尝试一下你的方法。)