2009-08-17 6 views
6

iPhoneのスクリーンショットをキャプチャする方法を探しています。現在、次のコードを使用しています。ステータスバーを含む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のスクリーンショットを正常に取得しますが、一番上のステータスバーを含めてください(その場所は空白の20ピクセルのスペースです)。

答えて

3

プライベートAPI UIGetScreenImageを呼び出すと、画面の内容全体を取得できます。詳細については、私のprevious answerからsimilar questionを参照してください。

+0

を私はこのプライベートAPIについて読みます私はAppleが私的なAPI機能を使ってiPhone用のアプリケーションを受け入れるかどうか知りたいのですが、 –

+3

プライベートAPIを使用すると気分が変わります。 1)プライベートAPIの使用は、アップルのルールに違反し、あなたのアプリが拒否されるか、店舗から引き出されるという明らかな方法の1つです。しかし... 2)スクリーンショットのような単純なものは、レーダーの下を飛行し、改造者に気付かれない可能性があります。まだ... 3)アップルは、何らかの理由で、何らかの警告を出さずに、将来的にいつでも、そのAPIを変更することができます。プライベートAPIを使用すると、頭痛の種になり、ユーザーエクスペリエンスが低下する可能性があります。 –

+0

この特定のケースでは、機能が動的にアクセスされ、失敗が説明されている場合、多くのリスクはないと考えています。アプリは標準の方法を使用してスクリーンショットに戻ることができます。私の答えでそれを具体的に実装するには静的なリンクが使われていますが、それは読者のための練習です。 – rpetrich

1

2009年10月8日現在、UIGetScreenImageを使用しているため、私のアプリは拒否されました。アップルはすべてのアプリをクリーンアップし、新しいOS/APIに準拠させようとしていると思う。代替案を探している。誰か提案があれば。 API?

1

代わりのプライベートAPIを使用して、なぜ画像コンテキストに全体UIWindowをレンダリングしない?あなたのコードでself.view.windowself.viewを交換するのに十分であるかもしれない。

をあなたはまた、現在のウィンドウを取得することができます(複数可) [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を使用する必要はありません。

+0

悲しいことに、UIApplicationのkeyWindowプロパティを使用すると、同じ問題 - 黒のステータスバーが発生します。明らかに、画面全体をキャプチャする(法的)方法はありません。 –

+0

ステータスバーは別のウィンドウにあります。あなたはUIApplicationの 'windows'プロパティをループして、同じイメージに順にレンダリングすることができます。 – benzado

+0

ステータスバーはどのように表示されますか? –

11

のiOS 7のとして、あなたはこの質問に対する私の答えを参照してください

UIView *screenshotView = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]; 

を使用して、民間のAPIの使用せずに、このを行うことができます。

Moving status bar in iOS 7

関連する問題