【问题标题】:Take screenshot and send it programmatically截取屏幕截图并以编程方式发送
【发布时间】:2014-04-17 18:26:25
【问题描述】:

当用户点击我应用程序中的按钮时,我想截取当前视图的屏幕截图并打开一条带有该屏幕截图图像作为附件的文本消息。如何在 iOS7 中做到这一点?

(我看过有关如何截取屏幕截图的帖子,但没有看到任何有关截取屏幕截图并将其附加到消息的帖子)

谢谢!

【问题讨论】:

  • 截图可以使用Quartz Display Services,即CGDisplayCreateImageForRectCGDisplayCreateImage
  • 您的问题是将屏幕截图作为彩信发送吗?您是否为捕获屏幕截图编写代码?
  • 我可以截屏,但我想自动将其附加到彩信中。

标签: ios sms screenshot mms


【解决方案1】:

1.截图添加QuartzCore框架,可以使用UIGraphicsBeginImageContextWithOptions

UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
[self.myView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *theImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

NSData *theImageData=UIImageJPEGRepresentation(theImage, 1.0 ); //you can use PNG too

2. 要在邮件中附加此图像,请在构建阶段添加MessageUI 框架。并使用此NSData 进行附加,类似这样

//Check if mail can be sent
if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
        mailer.mailComposeDelegate = self;

       // Add NSData you got as screenshot to attachment
       [mailer addAttachmentData:theImageData mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"test.jpg"]];  
        [self presentModalViewController:mailer animated:YES];

    }

编辑:

3.通过短信发送图片

    // Will Work only for iOS 7

    MFMessageComposeViewController* messageComposer = [[MFMessageComposeViewController alloc] init];
     messageComposer.messageComposeDelegate = self; // As mentioned by the OP in comments, we have to set messageComposeDelegate to self.
     messageComposer.recipients = [NSArray arrayWithObject:@"123456789"];

 if([MFMessageComposeViewController canSendText])
  {

    if([MFMessageComposeViewController respondsToSelector:@selector(canSendAttachments)] && [MFMessageComposeViewController canSendAttachments])
    {
        NSString* uti = (NSString*)kUTTypeMessage;
        [messageComposer addAttachmentData:theImageData typeIdentifier:uti filename:@"filename.jpg"];
    }

    [self presentViewController:messageComposer animated:YES completion:nil];
  }

处理来自MFMessageComposeViewController的委托回调

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result
{

}

【讨论】:

  • 这是一个很好的解决方案,但我真的需要通过短信 (SMS/MMS) 来做到这一点。有什么办法吗?
  • @shikaka,请检查编辑。一个问题是这仅适用于 iOS 7。并且尚未在设备上对其进行测试。对此感到抱歉
  • 出色的工作。还有 2 个问题: 1 - 完成后如何退出 MMS 撰写视图?会结冰吗? 2 - 它不会截取整个屏幕的屏幕截图。导航栏不在照片中,底部有一个奇怪的空白。你知道为什么吗?
  • @shikaka。要退出 MMS 撰写视图控制器,您必须在此处实现委托方法 - (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result;,您需要提供 `[self dismissViewControllerAnimated:YES completion:nil];`。当点击取消/完成或出现任何错误时调用此方法。
  • @shikaka,关于第二个问题,我不太确定,抱歉。或许你可以试试UIWindow *window = [[UIApplication sharedApplication]keyWindow];UIView *viewForScreen = window.viewForBaselineLayout;,不知道行不行
【解决方案2】:

要截屏,您可以使用Quartz Display Services 方法

您可以将矩形传递为

CGRect = [self bounds];

然后使用CGDisplayCreateImageForRect创建图像

CGImageRef selectedScreenImage;
selectedScreenImage = CGDisplayCreateImageForRect(kCGDirectMainDisplay, rect);

将其转换为NSData

NSData *data = (NSData *)CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(selectedScreenImage)));

然后使用MFMailComposeViewController将其附加到您的消息中

if ([MFMailComposeViewController canSendMail])
    {
        MFMailComposeViewController *cvc = [[MFMailComposeViewController alloc] init];
        cvc.mailComposeDelegate = self;

       [cvc addAttachmentData:data mimeType:@"image/jpeg" fileName:[NSString stringWithFormat:@"YOUR_IMAGE.png"]];  

        [self presentModalViewController:cvc animated:YES];

    }

【讨论】:

    【解决方案3】:

    发送彩信

    - (UIImage *) imageFromViewIniOS7
    {
    UIImage* image = nil;
    
    UIGraphicsBeginImageContext(contentScrollview.contentSize);
    {
        CGPoint savedContentOffset = contentScrollview.contentOffset;
        CGRect savedFrame = contentScrollview.frame;
    
        contentScrollview.contentOffset = CGPointZero;
        contentScrollview.frame = CGRectMake(0, 0, contentScrollview.contentSize.width, contentScrollview.contentSize.height);
        if ([[NSString versionofiOS] intValue]>=7)
        {
            [contentScrollview drawViewHierarchyInRect:contentScrollview.bounds afterScreenUpdates:YES];
    
        }
        else
        {
            [contentScrollview.layer renderInContext: UIGraphicsGetCurrentContext()];
    
        }
        image = UIGraphicsGetImageFromCurrentImageContext();
    
        contentScrollview.contentOffset = savedContentOffset;
        contentScrollview.frame = savedFrame;
    }
    UIGraphicsEndImageContext();
    
    
    return image;
    }
    -(void)buttonAction
    {
    MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard]; 
    pasteboard.persistent = YES;
    pasteboard.image = [self imageFromViewIniOS7];
    
    NSString *phoneToCall = @"sms:";
    NSString *phoneToCallEncoded = [phoneToCall stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
    NSURL *url = [[NSURL alloc] initWithString:phoneToCallEncoded];
    [[UIApplication sharedApplication] openURL:url];    
    
    if([MFMessageComposeViewController canSendText]) {
    NSMutableString *emailBody = [[NSMutableString alloc] initWithString:@"Your Email Body"];
    picker.messageComposeDelegate = self;
    picker.recipients = [NSArray arrayWithObject:@"123456789"];
    [picker setBody:emailBody];// your recipient number or self for testing
    picker.body = emailBody;
    NSLog(@"Picker -- %@",picker.body);
    [self presentModalViewController:picker animated:YES];
    NSLog(@"SMS fired");
    }
    }
    

    【讨论】:

    • 谢谢。是否可以在不需要粘贴的情况下做到这一点?只是自动在短信中添加图片?