2009-03-28 15 views
2

私は、内蔵のグラフィックスとユーザー定義のテキストを使用して画像を作成するためのiPhoneアプリを開発しています。iPhoneアプリの全画面をメールで送信

私は自分のアプリを持っていて、グラフィックスとユーザー定義のテキストを持っていて、スクリーンショットのような単一のイメージとして電子メールアプリケーションに送ることができます。

スクリーンショットを撮ったり、アプリを離したり、フォトアプリに行ったり、スクリーンショットを選択したり、そこからメールを送信したりすることなく、これを行う方法はありますか?

最終的に私は、ユーザーがタップすることができ、画面全体がキャプチャされ、メールアプリケーションに直接送信される、アプリケーション内にボタンを持つことができるようにしたいと考えています。

感謝の言葉を受け入れてください!

答えて

0

これがうまくいくかどうかはわかりませんが、ビットマップを使用したグラフィックスコンテキストを作成してから、ルートビューのコアアニメーションレイヤーを取得し、-renderInContext:メソッドを呼び出すことができます。そのかもしれないそれを行うが、私はそれを試みたことはありません。

しかし、おそらく、あなたは別のアプローチを考慮する必要があります。画面に表示される一連のカスタム描画コードを書いただけで、ファイルやメモリバッファにも描画できるようにしたいのですか?もしそうなら、おそらく、あなたのビューから、そしてあなたのビューが単に使用する別のオブジェクトに、その描画コードを考慮する必要があります。それは非常に簡単にそれを両方の方法で描画することができます。それが去るよう

UIWindow *screenWindow = [[UIApplication sharedApplication] keyWindow]; 

UIGraphicsBeginImageContext(screenWindow.frame.size); 
[screenWindow.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

NSData *screenshotPNG = UIImagePNGRepresentation(screenshot); 

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 

NSError *error = nil; 
[screenshotPNG writeToFile:[documentsDirectory stringByAppendingPathComponent:@"screenshot.png"] options:NSAtomicWrite error:&error]; 

これは、少しの粗である:次のコードは、スクリーンショットをつかむと、screenshot.pngと呼ばれるPNGとしてDocumentsディレクトリにそれを保存します、ブレントの答えにより拡大すること

5

タイトルバーの画面上部付近に空白があり、CAEAGLLayersからコンテンツを取得していないようです。

また、標準のmailto:// URL構造とそれに続くopenURLを使用してMIMEエンコードされた添付ファイルを送信することはできません。おそらく、3.0 SDKはこれを修正しますが、私はまだこれを試していません。アプリケーション内から直接メッセージを送信するには、sksmtpmessageのようなものを使用する必要があります。

+0

UIApplicationのウィンドウ配列をループして、それらをすべて(キーウィンドウだけではなく)レンダリングすると、ステータスバーが描画されます。 – benzado

4

プライベートAPI UIGetScreenImageもあります。それはそうと同じように使用されている:

CGImageRef UIGetScreenImage(); 
@interface UIImage (ScreenImage) 
+ (UIImage *)imageWithScreenContents; 
@end 

@implementation UIImage (ScreenImage) 
+ (UIImage *)imageWithScreenContents 
{ 
    CGImageRef cgScreen = UIGetScreenImage(); 
    if (cgScreen) { 
     UIImage *result = [UIImage imageWithCGImage:cgScreen]; 
     CGImageRelease(cgScreen); 
     return result; 
    } 
    return nil; 
} 
@end 

この機能はPNGを生成するUIImagePNGRepresentationと組み合わせることができます。

+0

これはうまく動作していたのですが、今は動作しません。 – Dimitris

+0

これはまだ動作しますが、オンデバイス(シミュレータではありません)のみであり、Appleは間違いなくそれを拒否します。 – rpetrich

1

skpsmtpmessageです。事実、それはとても良いことです。私はそこに行ってクローンを作成し、githubでサンプルプロジェクトを追加しました。以下のサンプルGUIでは、プログレスバーやその他の機能のような鐘や笛がいくつか追加されていますが、基本的にはコアのskpsmtpmessageコードが維持されています。

http://github.com/kailoa/iphone-smtp/tree/master

0

OS 3.0では、あなたはMFMailComposeViewControllerを使用することができます。

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init]; 
picker.mailComposeDelegate = self; 
[picker addAttachmentData:screenshotPNG mimeType:@"image/png" fileName:@"PNGfromMyApp"]; 
3

Appleが使用するnow allowingアプリケーションです。

CGImageRef UIGetScreenImage(void); 

機能。保持されているCGImageRefを返すことを覚えておく必要がありますが、それに応じてメモリを管理する必要があります。

彼らはまた、iPhone OSの将来のリリースでは、この機能の公開APIに相当を提供することができる... 」、と言う。そんな時、UIGetScreenImageを()を使用して、すべてのアプリケーションがパブリックAPIを採用する必要があります。 "

関連する問題