我正在开发一款iPhone应用程序,用于使用内置图形和用户定义文本创建图像。
我希望能够拥有我的应用程序,内置图形和用户定义的文本,然后可以将其作为单个图像(非常类似于屏幕截图)发送到要通过电子邮件发送的电子邮件应用程序。
有没有办法在不截取屏幕截图的情况下执行此操作,离开应用程序,进入照片应用程序,选择屏幕截图,然后从那里通过电子邮件发送?
最终,我希望能够在我的应用中设置一个用户可以点按的按钮,整个屏幕将被捕获并直接发送到邮件应用。
感激地接受任何指针!
答案 0 :(得分: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之类的内容直接从您的应用程序中发送消息。
答案 1 :(得分: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。
答案 2 :(得分:3)
Apple是now allowing个应用程序使用;
CGImageRef UIGetScreenImage(void);
功能。虽然你必须记住它返回一个保留的CGImageRef,你必须相应地管理你的内存。
他们还说,“ ...未来的iPhone OS版本可能提供相当于此功能的公共API。此时,所有使用UIGetScreenImage()的应用程序都需要采用公共API。 “
答案 3 :(得分:1)
skpsmtpmessage很棒。事实上,它是如此的好,我去克隆它并在github上添加了示例项目。下面的示例GUI添加了一些铃声和口哨,如进度条和其他一些好东西,但它基本上维护核心skpsmtpmessage代码。
答案 4 :(得分:0)
我不知道这是否可行,但你可以尝试创建一个支持位图的图形上下文,然后获取根视图的核心动画层并调用它的-renderInContext:方法。那个可能做到了,但我从未尝试过。
但也许你应该考虑采用不同的方法。只是你已经编写了一堆在屏幕上可见的自定义绘图代码,并且你希望能够绘制到文件或内存缓冲区中吗?如果是这样,也许您应该将绘图代码从视图中分解出来,并放入视图简单使用的单独对象中。这样你就可以很容易地把它画成两种方式。
答案 5 :(得分:0)
在OS 3.0中,您可以使用MFMailComposeViewController:
MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
picker.mailComposeDelegate = self;
[picker addAttachmentData:screenshotPNG mimeType:@"image/png" fileName:@"PNGfromMyApp"];