Ios 如何在Swift中保存视图及其子视图的屏幕截图?

Ios 如何在Swift中保存视图及其子视图的屏幕截图?,ios,swift,uiview,calayer,screen-capture,Ios,Swift,Uiview,Calayer,Screen Capture,我想捕获一个视图及其子视图。我正在使用以下代码捕获屏幕: let view = self.faceTrackerContainerView UIGraphicsBeginImageContext(CGSizeMake(view.bounds.size.width, view.bounds.size.height)) UIGraphicsGetCurrentContext()! self.view?.drawViewHierarchyInRect(view.frame, afterScreenU

我想捕获一个视图及其子视图。我正在使用以下代码捕获屏幕:

let view = self.faceTrackerContainerView

UIGraphicsBeginImageContext(CGSizeMake(view.bounds.size.width, view.bounds.size.height))
UIGraphicsGetCurrentContext()!
self.view?.drawViewHierarchyInRect(view.frame, afterScreenUpdates: true)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)
这些代码捕获整个屏幕,包括视图前面的按钮。我尝试了这些代码,但它只捕获主视图,不包括其子视图:

let view = self.faceTrackerContainerView
let scale = UIScreen.mainScreen().scale
UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, scale);

view.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let screenshot = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

UIImageWriteToSavedPhotosAlbum(screenshot, nil, nil, nil)

我还在这里尝试了SnapshotViewAfterScreenUpdate(true),但我不知道如何实现它。我在视图下方有一个collectionView,在视图顶部有一个按钮(两者都不在视图中)。第一个代码通过按钮、collectionView和子视图捕获所有内容。第二个代码捕获没有子视图的视图。我错过了什么?

为什么不直接打电话?

这对我来说很有用

func screenShotMethod() {
    //Create the UIImage
    UIGraphicsBeginImageContext(faceTrackerContainerView.frame.size)
    faceTrackerContainerView.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    //Save it to the camera roll
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
}

它不是很优雅,但是在截图之前隐藏视图是有效的。然后,可以使它们在以后可见

view.isHidden = true

//screenshot

view.isHidden = false
它从UIView生成UIImage。然后可以将该图像与UIImageView(图像:)方法一起使用

  • 将所有子视图(要包含在屏幕截图中)添加到一个视图中 父视图

  • 按如下方式绘制父视图层次:


  • 谢谢你的密码。这方面我还不太熟悉。您介意告诉我需要更改/更正哪些部分吗?@Vinz:我想前面提到的方法将返回带有渲染捕获视图的UIView,而不是直接UIImage-您想存储在PhotoAlbum中,我尝试过使用它,但无法使其工作。在我的一次尝试中给了我一个空白。您要捕获的所有子视图都在屏幕上可见?是的,它们是可见的。我想我会在截图中隐藏我不想要的视图,然后放回去。嗨。谢谢你。这也是我获取代码的地方,它捕获了我屏幕上的所有内容。我只想用它的子视图捕获一个视图。试着从上面的代码用
    self.faceTrackerContainerView
    更改
    view
    。我试过了,但是视图没有renderContext方法。
    extension UIView {
        func asImage() -> UIImage {
            let renderer = UIGraphicsImageRenderer(bounds: bounds)
            return renderer.image { rendererContext in
                layer.render(in: rendererContext.cgContext)
            }
        }
    }
    
      let renderer = UIGraphicsImageRenderer(size: mapParentView.bounds.size)
        let image = renderer.image { ctx in
           mapParentView.drawHierarchy(in: mapParentView.bounds, afterScreenUpdates: true)
          }