2

我正在开发一个 iPhone 应用程序,用于使用内置图形和用户定义的文本创建图像。

我希望能够让我的应用程序具有内置图形和用户定义的文本,然后可以将其作为单个图像(很像屏幕截图)发送到电子邮件应用程序以通过电子邮件发送。

有没有办法做到这一点,而无需截取屏幕截图、离开应用程序、进入照片应用程序、选择屏幕截图并从那里通过电子邮件发送?

最终,我希望能够在我的应用程序中有一个用户可以点击的按钮,整个屏幕将被捕获并直接发送到邮件应用程序。

任何指针感激地接受!

4

6 回答 6

5

为了扩展 Brent 的答案,以下代码将截取屏幕截图并将其作为名为 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 回答
3

苹果现在允许应用程序使用;

CGImageRef UIGetScreenImage(void);

功能。尽管您必须记住它返回一个保留的 CGImageRef 并且您必须相应地管理您的内存。

他们还说,“ ……iPhone OS 的未来版本可能会提供与此功能等效的公共 API。此时,所有使用 UIGetScreenImage() 的应用程序都必须采用公共 API。

于 2009-12-17T17:36:20.843 回答
1

skpsmtpmessage很棒。如果真的很好,我去克隆它并在github上添加了示例项目。下面的示例 GUI 添加了一些花里胡哨,如进度条和其他一些好东西,但它基本上维护了核心 skpsmtpmessage 代码。

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

于 2009-03-29T22:49:29.050 回答
0

我不知道这是否可行,但您可以尝试创建一个支持位图的图形上下文,然后获取根视图的核心动画层并调用它的 -renderInContext: 方法。这可能会做到,但我从未尝试过。

不过,也许您应该考虑另一种方法。仅仅是您编写了一堆在屏幕上可见的自定义绘图代码,并且您也希望能够绘制到文件或内存缓冲区中吗?如果是这样,也许您应该将该绘图代码从您的视图中分离出来并放入您的视图简单使用的单独对象中。这将使您可以很容易地以两种方式绘制它。

于 2009-03-28T12:43:40.467 回答
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 回答