如何在Swift中保存包含子视图的视图的屏幕截图?

时间:2016-10-22 03:50:01

标签: 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, 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)

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

5 个答案:

答案 0 :(得分:9)

这对我有用,

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)
}

Ref

答案 1 :(得分:2)

为什么不拨打snapshotView(afterScreenUpdates:)

答案 2 :(得分:2)

extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

它从UIView制作UIImage。然后你可以使用UIImageView(图像:)方法

使用该图像

答案 3 :(得分:1)

它不是很优雅,但在截屏之前隐藏视图是有效的。然后,您可以将它们显示出来。

view.isHidden = true

//screenshot

view.isHidden = false

答案 4 :(得分:0)

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

  2. 像这样绘制父视图层次结构:

    <块引用>
      let renderer = UIGraphicsImageRenderer(size: mapParentView.bounds.size)
        let image = renderer.image { ctx in
           mapParentView.drawHierarchy(in: mapParentView.bounds, afterScreenUpdates: true)
          }