Отправка по электронной почте на весь экран приложения iPhone - PullRequest
2 голосов
/ 28 марта 2009

Я занимаюсь разработкой приложения для iPhone для создания изображений с использованием встроенной графики и пользовательского текста.

Я хочу иметь мое приложение со встроенной графикой и определенным пользователем текстом, которое затем можно отправить в виде отдельного изображения (подобно скриншоту) в приложение электронной почты для отправки по электронной почте.

Есть ли способ сделать это, не снимая скриншот, не выходя из приложения, не заходя в приложение «Фотографии», не выбирая скриншот и не отправляя его по электронной почте?

В конечном итоге я хотел бы иметь в своем приложении кнопку, которую пользователь мог бы нажать, и весь экран был бы захвачен и отправлен непосредственно в почтовое приложение.

Любые указатели с благодарностью приняты!

Ответы [ 6 ]

5 голосов
/ 28 марта 2009

Чтобы развернуть ответ Брента, следующий код сделает снимок экрана и сохранит его в каталоге документов в виде PNG-файла screenshot.png:

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.

Кроме того, я не верю, что вы можете использовать стандартную конструкцию URL mailto: //, за которой следует openURL, для отправки MIME-кодированных вложений. Возможно, SDK 3.0 исправит это, но я еще не поиграл с этим. Возможно, вам понадобится что-то вроде sksmtpmessage , чтобы отправить сообщение прямо из вашего приложения.

4 голосов
/ 29 марта 2009

Есть также приватный 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.

3 голосов
/ 17 декабря 2009

Apple теперь , что позволяет приложениям использовать;

CGImageRef UIGetScreenImage(void);

функция. Хотя вы должны помнить, что он возвращает сохраненный CGImageRef, и вам придется соответствующим образом управлять своей памятью.

Они также говорят, что « ... будущий выпуск iPhone OS может предоставить открытый API-эквивалент этой функции. В это время все приложения, использующие UIGetScreenImage (), должны будут принять открытый API-интерфейс."

1 голос
/ 30 марта 2009

skpsmtpmessage отлично. На самом деле, это так хорошо, я пошел и клонировал его и добавил пример проекта на github. В приведенном ниже примере графического интерфейса пользователя добавлено несколько функций, таких как индикатор выполнения и некоторые другие полезности, но в основном он поддерживает основной код skpsmtpmessage.

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

0 голосов
/ 24 июня 2009

В OS 3.0 вы можете использовать MFMailComposeViewController:

MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker addAttachmentData:screenshotPNG mimeType:@"image/png" fileName:@"PNGfromMyApp"];
0 голосов
/ 28 марта 2009

Я понятия не имею, сработает ли это, но вы можете попробовать создать графический контекст на основе растрового изображения, затем получить базовый слой анимации вашего корневого представления и вызвать его -renderInContext: метод. Это может сделать, но я никогда не пробовал.

Возможно, однако, вы должны рассмотреть другой подход. Просто вы написали несколько пользовательских кодов для рисования, которые видны на экране, и вы хотите иметь возможность рисовать в буфере файла или памяти? Если это так, возможно, вы должны выделить этот чертежный код из своего представления в отдельный объект, который просто использует ваше представление. Это позволило бы вам легко нарисовать его обоими способами.

...