是否可以创建全视图控制器的图像(而不仅仅是屏幕上的内容)?

时间:2017-10-16 12:45:35

标签: swift xcode image uiview uiviewcontroller

这是我目前正在使用的代码:

func configureMailController() -> MFMailComposeViewController {
    UIGraphicsBeginImageContext(self.view.bounds.size);
    self.view.layer.render(in: UIGraphicsGetCurrentContext()!)
    let screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    let mailComposerVC = MFMailComposeViewController()
    mailComposerVC.mailComposeDelegate = self

    mailComposerVC.setToRecipients(["emailaddress@email.com"])
    mailComposerVC.setSubject("Form")
    mailComposerVC.setMessageBody("Here's the image", isHTML: true)
    let imageData: NSData = UIImagePNGRepresentation(screenShot!)! as NSData
    mailComposerVC.addAttachmentData(imageData as Data, mimeType: "image/png", fileName: "imageName")
    return mailComposerVC
}

此代码通过电子邮件发送screenShot图像,但我需要它是一个更大的图像,显​​示整个viewController,而不仅仅是激活动作时屏幕上的底部。

是否可以调整此代码来执行此操作,我尝试将代码从使用我的UIView更改为我的UIScrollView,但这样做也没有用,实际上甚至没有生成图像。< / p>

更新:我已附加视频以显示当前正在发生的事情。

enter image description here

2 个答案:

答案 0 :(得分:2)

我在我的一个项目上测试了你的代码并且整个视图控制器被捕获得很好,唯一缺少的是导航控制器中的导航栏。

如果你想捕获navigationBartabBar,你需要确保选择正确的视图进行渲染,这里有一个例子来检查navigationController是否存在并抓住navigationController的观点

func configureMailController() -> MFMailComposeViewController {
    let nav = self.navigationController!
    UIGraphicsBeginImageContext(nav.view.bounds.size);
    nav.view.layer.render(in: UIGraphicsGetCurrentContext()!)
    let screenShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    let mailComposerVC = MFMailComposeViewController()
    mailComposerVC.mailComposeDelegate = self
    mailComposerVC.setToRecipients(["emailaddress@email.com"])
    mailComposerVC.setSubject("Form")
    mailComposerVC.setMessageBody("Here's the image", isHTML: true)
    let imageData: NSData = UIImagePNGRepresentation(screenShot!)! as NSData
    mailComposerVC.addAttachmentData(imageData as Data, mimeType: "image/png", fileName: "imageName")
    return mailComposerVC
}

希望有所帮助,仍然希望看到您最终获得的屏幕截图,以便我确定您的问题。

更新:现在您已经添加了我可以看到您正在使用scrollView的视频。我没有对此进行过测试,但您要首先告诉图形上下文使用scrollView中的contentSize

我不确定这是否会捕获所有的scrollView内容,因为我们仍在使用navigationControllers视图进行渲染。

您可能需要告诉您scrollView不要剪辑它的内容,并将scrollView发送回顶部,如下所示:

...

self.scrollView.clipsToBounds = false
self.scrollView.setContentOffset(CGPoint(x:0, y:0), animated: false)

let nav = self.navigationController!
UIGraphicsBeginImageContext(self.scrollView.contentSize);
nav.view.layer.render(in: UIGraphicsGetCurrentContext()!)
let screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

...

让我知道你是怎么过的。

答案 1 :(得分:0)

根据@Wez的回答:

使用下面的代码创建整个滚动视图的图像。

...

self.scrollView.clipsToBounds = false
self.scrollView.setContentOffset(CGPoint(x:0, y:0), animated: false)

let scroll = self.scrollView!
UIGraphicsBeginImageContext(self.scrollView.contentSize);
scroll.layer.render(in: UIGraphicsGetCurrentContext()!)
let screenShot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

...

但是,这不包括导航栏。为了我的目的,没有必要使用导航栏,但如果有人确实找到了包含它的方法,那就太棒了。