Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 是否可以创建全视图控制器的图像(而不仅仅是一次在屏幕上显示什么)?_Swift_Xcode_Image_Uiview_Uiviewcontroller - Fatal编程技术网

Swift 是否可以创建全视图控制器的图像(而不仅仅是一次在屏幕上显示什么)?

Swift 是否可以创建全视图控制器的图像(而不仅仅是一次在屏幕上显示什么)?,swift,xcode,image,uiview,uiviewcontroller,Swift,Xcode,Image,Uiview,Uiviewcontroller,这是我目前正在使用的代码: func configureMailController() -> MFMailComposeViewController { UIGraphicsBeginImageContext(self.view.bounds.size); self.view.layer.render(in: UIGraphicsGetCurrentContext()!) let screenShot = UIGraphicsGetImageFromCurrent

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

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
}
这段代码电子邮件屏幕截图的图像,但我需要它是一个更大的图像显示整个viewController,而不仅仅是底部的一部分,这是在屏幕上的行动被激活

是否可以调整此代码以实现此目的,我尝试将代码从使用UIView更改为使用UIScrollView,但这也不起作用,事实上,甚至没有生成图像

更新:我附上了一个视频来展示当前正在发生的事情


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

如果要捕获
导航栏
选项卡栏
,需要确保选择正确的视图进行渲染,下面的示例将检查
导航控制器
是否存在,并获取
导航控制器
的视图

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中的
contentSize

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

您可能需要告诉您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();

...

让我知道你进展如何。

下面是@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();

...

但是,这不包括导航栏。就我而言,没有必要使用导航栏,但如果有人找到了包含导航栏的方法,那就太好了。

您有当前获得的屏幕截图示例吗?-你有导航控制器或TabBar控制器吗?谢谢你的帮助,我会尽快得到截图,但我不知怎么搞砸了故事板,现在xcode在试图更改回它时完全没有响应,所以看起来我必须在发送截图之前重做很多项目。很抱歉回复太慢,我终于修复了我的项目。我用视频更新了我的原始帖子,以显示我运行应用程序时发生的事情。我以前没有导航栏,但现在有了,所以我必须添加您描述的更改,但是我仍然存在相同的问题,它没有显示完整的ViewController。再更新一次,我使用了与您完全相同的代码,以查看这是否会改变任何内容。但是,我无法运行它,因为我在一个函数中得到一个错误,该函数预期在最终}上返回“MFMailComposer ViewController”。你知道我为什么会这样吗?我尝试了一些方法,但是找不到答案。嘿,我已经更新了答案,以防止丢失返回错误。非常感谢!我刚刚运行了那段代码,导航栏被捕获了,但是仍然存在一个问题,那就是它不是完整的viewController。所以还是和我发布的视频一样。我想你需要意识到为什么会发生这种情况,而不仅仅是寻求越来越多的帮助,因为我认为你可以自己完成这项工作。。1.上下文需要与要渲染的内容大小相同,它当前不够大,无法包含导航栏。2.您需要确保要渲染的所有内容都在您选择运行
.render
方法的视图中可见,这意味着确保内容不会被剪切到任何父视图上。@Wez您完全正确,我需要了解发生了什么。直到我最后一次回答,我才真正理解这一切是如何运作的。你的评论证实了它的工作方式和我想象的一样,但我试图改变一些东西,包括导航栏,但无法让它工作。这就是为什么我提出了答案,我问了额外的信息,因为我无法弄清楚。但我明白我确实需要学习自己,而不是太快地问问题。