2

組み込みのグラフィックスとユーザー定義のテキストを使用して画像を作成するための iPhone アプリを開発しています。

グラフィックスとユーザー定義のテキストが組み込まれたアプリを作成し、それを単一の画像 (スクリーンショットのようなもの) として電子メール アプリに送信して、電子メールで送信できるようにしたいと考えています。

スクリーンショットを撮らずに、アプリを終了し、写真アプリに移動し、スクリーンショットを選択して、そこからメールで送信せずにこれを行う方法はありますか?

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

どんな指摘もありがたく受け入れました!

4

6 に答える 6

5

ブレントの答えを拡張するために、次のコードはスクリーンショットを取得し、それを Screenshot.png という名前の PNG として Documents ディレクトリに保存します。

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];

画面の上部近くにタイトル バー用の空白の場所が残り、CAEAGLLayers からコンテンツを取得しているようには見えないため、これは少し大雑把です。

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

于 2009-03-28T15:15:02.490 に答える
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

この関数を と組み合わせてUIImagePNGRepresentation、PNG を生成することができます。

于 2009-03-29T15:48:14.260 に答える
1

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

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

于 2009-03-29T22:49:29.050 に答える
0

OS 3.0 では、MFMailComposeViewController を使用できます。

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker addAttachmentData:screenshotPNG mimeType:@"image/png" fileName:@"PNGfromMyApp"];
于 2009-06-24T06:08:25.830 に答える
0

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

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

于 2009-03-28T12:43:40.467 に答える